2016-08-04 29 views
11

Ich arbeite an einem Hadoop-Projekt und nach vielen Besuchen in verschiedenen Blogs und Lesen der Dokumentation, erkannte ich, dass ich Secondry-Sortierfunktion von Hadoop-Framework zur Verfügung gestellt werden muss.Sekundäre Sortierung in Hadoop

Mein Eingabeformat ist von der Form:

DESC(String) Price(Integer) and some other Text

ich die Werte in den Minderer will Reihenfolge des Preises sein absteigend. Auch beim Vergleichen von DESC habe ich eine Methode, die zwei Strings und einen Prozentsatz akzeptiert und wenn die Ähnlichkeit zwischen den beiden Strings gleich oder größer als der Prozentsatz ist, dann sollte ich sie als gleich betrachten.

Das Problem ist, nachdem der Reduce Job abgeschlossen ist, kann ich einige DESC sehen, die der anderen Zeichenfolge ähnlich ist, und doch sind sie in anderer Gruppe.

Hier ist meine Methode compareTo von Composite-Schlüssel

public int compareTo(VendorKey o) { 
    int result =- 
    result = compare(token, o.token, ":") >= percentage ? 0:1; 
    if (result == 0) { 
     return pid> o.pid ?-1: pid < o.pid ?1:0; 
    } 
    return result; 
} 

und vergleichen Methode der Gruppierung Vergleicher

public int compare(WritableComparable a, WritableComparable b) { 
    VendorKey one = (VendorKey) a; 
    VendorKey two = (VendorKey) b; 
    int result = ClusterUtil.compare(one.getToken(), two.getToken(), ":") >= one.getPercentage() ? 0 : 1; 
    // if (result != 0) 
    // return two.getToken().compareTo(one.getToken()); 
    return result; 
} 
+0

Hat das Reparieren der compareTo-Methode für Sie funktioniert? – aventurin

Antwort

0

Es scheint, dass Ihr compareTo Methode der gemeinsame contract verletzt, die sgn(x.compareTo(y)), um gleich -sgn(y.compareTo(x)) erfordert .

0

Geben Sie nach Ihrer customWritable einen grundlegenden Partitionierer mit einem zusammengesetzten Schlüssel und NullWrite-Wert ein. Zum Beispiel:

Und danach geben Sie Key Sortierung Komparator und mit 2 CompositeKeyWritable Variablen wird die Gruppierung erfolgen.

0

Es gibt 3 Verfahren während Shuffle: Partitioning, Sortierung und Gruppierung. Ich vermute, dass Sie mehrere Reduzierungen haben und Ihre ähnlichen Ergebnisse wurden von verschiedenen Reduzierungen verarbeitet, da sie sich in verschiedenen Partitionen befinden.

Sie können die Anzahl der Reduzierungen auf 1 setzen oder eine benutzerdefinierte Partitionierer festlegen, die org.apache.hadoop.mapreduce.Partitioner für Sie Job erweitert.