2017-11-10 2 views
0

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!

Antwort

0

Der Reduktor erhält alle diese Daten, aber diese Daten werden tatsächlich auf die Festplatte geschrieben und nur in den Speicher geladen, wenn Sie die Iteratable-Werte durchlaufen. Tatsächlich wird das Objekt, das von dieser Iteration zurückgegeben wird, für jeden Wert wiederverwendet: Die Felder und der andere Zustand werden einfach ersetzt, bevor das Objekt an Sie übergeben wird.

Das bedeutet, dass Sie das Wertobjekt explizit kopieren müssen, um alle Wertobjekte gleichzeitig im Speicher zu haben.

Wenn ich Ihren Code anschaue, werden die Objektpaare nicht gespeichert. Sie schreiben die Artikelpaare direkt aus, damit Sie gut sein sollten.

Verwandte Themen