3

多くのマッパーとリデューサーをチェーンするツールがあり、ある時点で、以前の map-reduce ステップの結果をマージする必要があります。たとえば、入力として、データを含む 2 つのファイルがあります。

/input/a.txt
apple,10
orange,20

*/input/b.txt*
apple;5
orange;40

結果は c.txt である必要があります。ここで、c.value = a.value * b.value

/output/c.txt
apple,50   // 10 * 5
orange,800 // 40 * 20

どのようにそれを行うことができますか?単純な Key => MyMapWritable (type=1,2, value) を導入し、リデューサーでデータをマージ (実際には乗算) することでこれを解決しました。それは動作しますが、:

  1. もっと簡単にできそうな気がする(いい匂いがしない)
  2. Mapper 内で、どのファイルがレコード プロバイダー (a.txt または b.txt) として使用されたかを正確に知ることはできますか? 今のところ、コンマとセミコロンの異なるセパレータを使用しました:(
4

2 に答える 2

3

それらが同じ方法で分割およびソートされていると仮定すると、CompositeInputFormatを使用してマップ側結合を実行できます。ここに使用に関する記事があります。ただし、新しい mapreduce api には移植されていないと思います。

次に、 を呼び出してマッパーで入力ファイルを取得できますcontext.getInputSplit()。これにより InputSplit が返されます。これを を使用している場合はTextInputFormat、 にキャストしてFileInputSplitから を呼び出しgetPath()てファイル名を取得できます。TupleWritable の Writable がどこから来たのか分からないので、このメソッドを CompositeInputFormat で使用できるとは思いません。

于 2012-07-15T20:16:46.217 に答える