私はhadoopのために書いている小さなmap-reduceプログラムを持っています。プログラムの1つの要素はすべてのリストのペアを作成することです。プログラムの入力がある場合、例えば:hadoopの値リストのすべてのペアを作成する
item1 tag1
item2 tag1
item3 tag2
item4 tag1
item5 tag2
マイマップ機能は<tag, item>
ペアを作成するので、減速機は、その入力として<tag, List<item>>
を受信します。
item1-item2 tag1
item1-item4 tag1
item2-item4 tag1
item3-item5 tag2
ので、本質的に、値のすべてのリストについては、すべての可能なペアを作成し、各ペアにキーを作るために:私の目標はする減速機から出力用です。
私はうまくいくソリューションを見つけましたが、リストをメモリにコピーしてそれを反復することに依存しています。私のデータセットが非常に大きくなる可能性があるので、これは問題になるかもしれません:
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
List<String> list = new ArrayList<String>();
for (Text t : values) {
list.add(t.toString());
}
for (int i=0; i<list.size()-1; i++) {
for (int j=i+1; j<list.size(); j++) {
out.set(list.get(i) + "-" + list.get(j))
context.write(out, one);
}
}
}
は、代替、またはHadoopの中でそれをやって、より効率的な方法はありますか?
私は各リストをメモリにコピーしたくありません。
私は別のmap-reduceステップを使用するような創造的なものを考え出してきましたが、動作するものを見つけることはできません。
ありがとうございました!