2017-06-21 16 views
0

Ich versuche, in Pseudo-Code eine MapReduce Aufgabe schreiben, die die Elemente in absteigender Reihenfolge sortiert zurückgibt. Zum Beispiel: für die Aufgabe wordcount, anstatt sich:MapReduce nach Wert sortieren in absteigender Reihenfolge

apple 1 
banana 3 
mango 2 

Ich möchte die Ausgabe sein:

banana 3 
mango 2 
apple 1 

Irgendwelche Ideen, wie es zu tun? Ich weiß, wie man es in aufsteigender Reihenfolge macht (ersetze die Schlüssel und den Wert im Mapper-Job), aber nicht in absteigender Reihenfolge.

+1

„sekundäre Sortier mapreduce“ für Suchen Sie einfach und Sie werden viele Beispiele finden. –

+0

@BinaryNerd Dies ist keine sekundäre Sortierung, wenn ich mich nicht irre. Dies ist nur eine Art nach Wert, die einfacher ist als die sekundäre Sortierung. – philantrovert

+0

Sortieren nach Wert ist eine sekundäre Sortierung in hadoop mapreduce, die primäre Sortierung ist auf dem Schlüssel. –

Antwort

0

Hier können Sie die Hilfe des unten angegebenen Reduziercodes verwenden, um die Sortierung in absteigender Reihenfolge zu erreichen.

Angenommen, Sie Mapper und Treiber-Code geschrieben haben, in der Mapper Ausgabe als (Banane, 1) produzieren usw.

In Minderer werden fassen wir alle Werte für einen bestimmten Schlüssel und setzen Endergebnis in einer Karte dann die Karte sortieren auf der Grundlage der Werte und schreibe das Endergebnis in die Aufräumfunktion Reduzieren.

finden Sie unter Code für die weitere understadnind:

public class Word_Reducer extends Reducer<Text,IntWritable, Text , 
    IntWritable> { 
// Change access modifier as per your need 
public Map<String , Integer > map = new LinkedHashMap<String , Integer>(); 
public void reduce(Text key , Iterable<IntWritable> values ,Context context 
) 
{ 

// write logic for your reducer 
// Enter reduced values in map for each key 
for (IntWritable value : values){ 

    // calculate "count" associated with each word 

} 
map.put(key.toString() , count); 



    } 

     public void cleanup(Context context){ 
    //Cleanup is called once at the end to finish off anything for reducer 
    //Here we will write our final output 
    Map<String , Integer> sortedMap = new HashMap<String , Integer>(); 

/
    sortedMap = sortMap(map); 

    for (Map.Entry<String,Integer> entry = sortedMap.entrySet()){ 
    context.write(new Text(entry.getKey()),new 
     IntWritable(entry.getValue())); 
     } 


    } 
    public Map<String , Integer > sortMap (Map<String,Integer> unsortMap){ 

    Map<String ,Integer> hashmap = new LinkedHashMap<String,Integer>(); 
    int count=0; 
    List<Map.Entry<String,Integer>> list = new 
    LinkedList<Map.Entry<String,Integer>>(unsortMap.entrySet()); 
//Sorting the list we created from unsorted Map 
    Collections.sort(list , new Comparator<Map.Entry<String,Integer>>(){ 

    public int compare (Map.Entry<String , Integer> o1 , Map.Entry<String , 
     Integer> o2){ 
     //sorting in descending order 
     return o2.getValue().compareTo(o1.getValue()); 

    } 


}); 

    for(Map.Entry<String, Integer> entry : list){ 
    // only writing top 3 in the sorted map 
     if(count>2) 
     break; 

     hashmap.put(entry.getKey(),entry.getValue()); 


} 

    return hashmap ; 

} 

    } 
+0

Vielen Dank für die Antwort! Ich habe aus Ihrer Antwort verstanden, wie Sie die Werte des gleichen Schlüssels sortieren. Ich glaube nicht, dass die Map aller Strings und ganzen Zahlen durch diesen ganzen Prozess gespeichert werden würde. Außerdem, wie würde ich wissen, wann die Aufräumfunktion aufgerufen werden soll? –

+1

Die Bereinigungsfunktion wird am Ende der Reduzierungsaufgabe einmal automatisch aufgerufen. –

+0

Ok, gut. Was ist mit dem ersten, was ich erwähnt habe? Ich glaube nicht, dass die Map der Schlüssel und Werte gespeichert und während des gesamten Prozesses aktualisiert wird. Ich denke, die einzige Variable, die das tut, ist Counter. Liege ich falsch? –

Verwandte Themen