MapReduce sort by value in descending order

时间秒杀一切 提交于 2019-12-02 15:55:58

问题


I'm trying to write in pseudo code a MapReduce task that returns the items sorted in descending order. For example: for the wordcount task, instead of getting:

apple 1
banana 3
mango 2

I want the output to be:

banana 3
mango 2
apple 1

Any ideas of how to do it? I know how to do it in ascending order (replace the keys and value in the mapper job) but not in descending order.


回答1:


Here you can take help of below reducer code to achieve sorting in descending order .

Assuming you have written mapper and driver code where mapper will produce output as (Banana,1) etc

In reducer we will sum all values for a particular key and put final result in a map then sort the map on the basis of values and write final result in cleanup function of reduce.

Please see below code for further 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 ;

}

  }


来源:https://stackoverflow.com/questions/44679841/mapreduce-sort-by-value-in-descending-order

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!