2017-11-06 2 views
0

Ich bin neu bei hadoop mapreduce Programmierparadigma, kann mir jemand sagen, wie kann ich basierend auf Werten leicht sortieren? Ich habe versucht, eine andere Vergleichsklasse zu implementieren, aber gibt es einen einfacheren Weg wie durch Job-Konfiguration, um basierend auf Werten des Reduzierers zu sortieren. Im Grunde lese ich Log-Dateien und ich möchte URL in aufsteigender Reihenfolge zu hitcount bestellen.aufsteigende Sortierung basierend auf den Werten des Reduzierers

+0

Sortieren leicht? Schreibe MapReduce nicht. Verwenden Sie Pig/Hive/Spark –

+0

Ich muss map reduzieren, das ist eine Einschränkung, leider. – cowgirl

Antwort

0

Deklarieren Sie eine Karte in Ihrer Reducer-Klasse und fügen Sie den Schlüssel und die Werte in die Karte ein. Jetzt in der cleanup() - Methode Ihrer Reducer-Klasse versuchen, die Karte nach Werten zu sortieren und schließlich die Werte in context.write (Schlüssel, Wert);

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {  
private IntWritable result = new IntWritable(); 

TreeMap<Text,IntWritable>result=new TreeMap<Text, IntWritable>(); 

public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
    int sum = 0; 
    for (IntWritable val : values) { 
    sum += val.get(); 
    } 
result.put(new Text(key),new IntWritable(sum)); 
} 
} 

    @Override 
    protected void cleanup(Context context) 
      throws IOException, InterruptedException { 

     Set<Entry<Text, IntWritable>> set = result.entrySet(); 
     List<Entry<Text, IntWritable>> list = new ArrayList<Entry<Text,IntWritable>>(set); 
     Collections.sort(list, new Comparator<Map.Entry<Text, IntWritable>>() 
     { 
      public int compare(Map.Entry<Text, IntWritable> o1, Map.Entry<Text,IntWritable> o2) 
      { 
       return (o2.getValue()).compareTo(o1.getValue()); 
      } 
     }); 
     for(Map.Entry<Text,IntWritable> entry:list){ 

      context.write(entry.getKey(),entry.getValue()); 
     } 

    } 
    } 
0

In diesem Fall müssen Sie zwei Map-Reduce-Jobs schreiben. Erster Job, zählen Sie die Anzahl der URLs. wie Ausgabe von fisrt Aufgabe wird es sein -

yahoo.com,100 
google.com,200 
msn.com,50 

Pass dieses zweite Karte Job reduzieren und es auf Zählung basierte sortieren.

Verwandte Themen