如何在MapReduce中按降序排列数据?

xzv2uavs  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(356)

我的减速机给这个o/p

Country-Year,Medals
India-2008,60
United States-2008,1237
Zimbabwe-2008, 2
Namibia-2009,22
China-2009,43
United States-2009,54

我想要的是,根据奖牌进行排序,并显示前三名。

Country-Year,Medals
United States-2008,1237
India-2008,60
United States-2009,54

有人建议我在定制的recordreader中进行排序(我知道它是在mapper部分使用的),我浏览了一些资源,但找不到关于排序的内容。请分享任何想法或链接到资源。提前谢谢!

nvbavucw

nvbavucw1#

当您在reducer类中聚合Map器的结果而不是将其写入输出时,请将其放入Map中,然后对Map进行排序并相应地显示结果。
key=country-year,value=modules虚拟代码展示如何实现

public class Medal_reducer extends Reducer<Text,IntWritable, Text , IntWritable> {
 // Change access modifier as per your need 
 public Map<String , Integer > map = new HashMap<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
    }
     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 HashMap<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 ;

    }

  }

希望这会有所帮助。

mzaanser

mzaanser2#

您可以实现map reduce top k设计模式来实现您的目标。
top k设计模式将根据值对记录进行排序,并选择top k记录。
您可以通过此链接在数据上实现top k设计模式。

相关问题