代码之家  ›  专栏  ›  技术社区  ›  cowgirl

基于减速器值的升序排序

  •  2
  • cowgirl  · 技术社区  · 8 年前

    我是hadoop mapreduce编程范例的新手,有人能告诉我如何轻松地根据值排序吗?我尝试实现另一个比较器类,但有没有一种更简单的方法,比如通过作业配置来根据减速机的值进行排序。基本上我是在读日志文件,我想按升序排列url到命中率。

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
    
    private final static IntWritable ONE = new IntWritable(1);
    private Text word = new Text();
    
    public void map(Object key, Text value, Context context
                    ) throws IOException, InterruptedException {
        String[] split = value.toString().split(" ");
        for(int i=0; i<split.length; i++){
            if (i==6)
                word.set(split[i]);
                context.write(word, ONE);
        }
    }
    }
    
    public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {       
    private IntWritable result = new 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.set(sum);
      context.write(key, result);      
    }
    }
    
    2 回复  |  直到 8 年前
        1
  •  5
  •   Vishal Jadiya    8 年前

    在reducer类中声明一个映射,并将键和值放入映射中。 现在,在reducer类的cleanup()方法中,尝试按值对地图排序,然后最后在上下文中给出值。写入(键、值);

    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());
            }
    
        }
        }
    
        2
  •  0
  •   Jembo    8 年前

    在这种情况下,您必须编写两个映射减少作业。第一个作业统计URL。 第一个作业的输出类似-

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

    将此传递给第二个map reduce作业,并根据计数对其进行排序。