2011-01-03 5 views
1

テキストファイルを別のテキストファイルに変換する必要がある場合、どのようにマッパー/レデューサーを設計しますか?map/reduceでETLを実行する方法

私は小さな変換をしたシンプルなマップ/削減プログラムを書きましたが、要件は以下もう少し凝っているが詳細は以下のとおりです。

  • ファイルは通常、次のように構成されている - 最初の行は、カンマが含まれています列名の区切りリスト。残りの行は列に対して値を指定します
  • 一部の行では、後続列の値が不足している可能性があります。例:15列がある場合、最初の10列に対してのみ値が指定されます。
  • 私は変換して1つのファイルに集約する必要がある約5つの入力ファイルがあります。変換は5つの入力ファイルのそれぞれに固有です。
  • ファイル名などのコンテキスト情報をマッパー/レデューサープログラムに渡すにはどうすればよいですか?
  • 変換は列に固有なので、最初の行に記載されている列を覚えてから、行内の値を相互に関連付けて変換するにはどうすればよいですか?
+2

関連する回答が必要な場合は、実際に詳細を入力する必要があります。テキストファイルを別のテキストファイルに変換するとほとんどのマップがそこに縮小されます... –

答えて

3

ファイルを行に分割し、各行を並列に変換(マップ)し、結果の行を1つのファイルに結合(減らす)しますか?

+0

私は単純なマップを作成し、小さな変換をしたプログラムを減らしますが、私が直面しているさらなる課題は以下のとおりです。 - 最初の行には、カンマで区切られた列名のリストが含まれています。行の残りの部分は列に対して値を指定します。一部の行では、後続の列の値が不足している可能性があります。例:15個の列がある場合、値は最初の10個の列に対してのみ指定されます。 – sandeepkunkunuru

+0

私は変換して1つのファイルに集約する必要がある約5つの入力ファイルを持っています。変換は入力ファイルに固有です。ファイル名のようなコンテキスト情報をマッパー/レデューサープログラムに渡すにはどうすればよいですか?変換は列に固有なので、最初の行に記載されている列を覚えておき、行内の値を相互に関連付けて変換するにはどうすればよいですか? – sandeepkunkunuru

1

最初の行の列情報に頼ることはできません。ファイルがHDFSブロックより大きい場合、ファイルは複数の分割に分割され、各分割は異なるマッパーに渡されます。その場合、最初の分割を受け取ったマッパーだけが列情報を持つ最初の行を受け取り、それ以外は残りません。

ファイル固有のメタデータを別のファイルに渡してサイドデータとして配布することをお勧めします。マッパーまたはレデューサーのタスクがメタデータファイルを読み取る可能性があります。

Hadoop Contextオブジェクトを使用すると、マッパーが処理しているファイルの名前を取得できます。これらのすべての間で、私はあなたが参照しているすべてのコンテキスト情報を持っていると思うし、ファイル固有の変換を行うことができます。変換ロジックはファイルごとに異なりますが、マッパー出力は同じ形式である必要があります。

レデューサーを使用している場合、すべての出力を1つのファイルに集約するようにレデューサーの数を1に設定できます。