Ich habe ein kleines Map-Reduce-Programm Ich schreibe für hadoop, ein Element des Programms ist, alle Paare einer Liste zu erstellen. Zum Beispiel, wenn der Eingang für das Programm ist:Erstellen aller Paare von Werteliste in hadoop
item1 tag1
item2 tag1
item3 tag2
item4 tag1
item5 tag2
My Map-Funktion ein <tag, item>
Paar erzeugt, so dass die Druckminderer empfangen <tag, List<item>>
als seine Eingabe. Mein Ziel ist es für die Ausgabe von dem Druckminderer zu sein:
item1-item2 tag1
item1-item4 tag1
item2-item4 tag1
item3-item5 tag2
So im Wesentlichen, für jede Liste von Werten, die alle möglichen Paare zu schaffen, und jedes Paar einen Schlüssel machen.
Ich habe eine Lösung gefunden, die funktioniert, aber es beruht darauf, die Liste in den Speicher zu kopieren und darüber zu iterieren. Dies könnte ein Problem sein, da meine Datenmenge sehr groß sein kann:
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);
}
}
}
Gibt es eine Alternative, oder effizienter Weg, um es in Hadoop zu tun?
Ich möchte nicht jede Liste in den Speicher kopieren.
Ich habe versucht, etwas Kreatives wie einen anderen Map-Reduce-Schritt zu entwickeln, aber ich finde nicht, dass etwas funktioniert, das funktioniert.
Vielen Dank!