2010-12-27 3 views
1

複数のファイル(実際には2つのファイル)を入力ファイルとして使用します。複数の入力ファイルを入力ファイルとして使用するにはどうすればよいですか?

これらは同じデータパターンを持っています。 最後に、2つの入力ファイルからデータを差分したいと思っています。最後に

例えば、入力ファイルの 、B入力ファイル内

A 1 
B 2 
C 3 

A 1 
C 3 
D 4 

、Iは

B 2 
ような出力ファイルを生成したいです

(はい、これはA - Bの結果です)。

どのように私はハープでこの状況に達することができますか?

答えて

3

確かに、特に線の順番を気にしない場合は、

まず、あなたのマッパーは(line, filename)ペア発するあります

File A: 
(0, "A 1")→("A 1", A) 
(4, "B 2")→("B 2", A) 
(8, "C 3")→("C 3", A) 
File B: 
(0, "A 1")→("A 1", B) 
(4, "C 3")→("C 3", B) 
(8, "D 4")→("D 4", B) 

を(これはあなたがのInputFormatとしてTextInputFormatを使用していると仮定し、その受信したキーがファイル内の位置であるあなたが((FileSplit) context.getInputSplit()).getPath()とファイル名を取得することができます。

縮小フェーズでは、Hadoopは各キー(行)に関連付けられた値(ファイル名)を収集し、これをレデューサーに渡します。あなたの減速で、あなただけの、ただのファイル名を持つ行を発する、そして他人のために何かを排出しないはずです。

("A 1",{A,B})→nothing 
("B 2",{A})→"B 2" 
("C 3",{A,B})→nothing 
("D 4",{B})→nothing 

結果はファイルだけでAある行だけになります