如何从reducer中获得单个键值对作为输出



我是Hadoop Mapreduce的新手。我有一个要求,比如说我想找到分数最高的学生名字。考虑样本数据集

哈利数学80

Harry Physics 67

Daisy Science 89

Daisy Physics 90

Greg Maths 70

Greg Chemistry 79

我知道reducer对每个唯一的键进行迭代,因此我将获得3个带有name和total标记的输出键值对。但我需要总分最高的学生的姓名,即减速器输出->Daisy 179

以下是我写的reduce函数:

 static int maxMark = 0;
 static Text name = new Text();
 public static class Reduce extends MapReduceBase implements
        Reducer<Text, IntWritable, Text, IntWritable> {
    public void reduce(Text key, Iterator<IntWritable> values, 
    OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException{
   int totalMarks = 0;
   while(values.hasNext())
   {
      totalMarks+=values.next().get();
   }    
   if (totalMarks > maxMark){
      maxMark = totalMarks;
      name = key;
          output.collect(name, new IntWritable(maxMark));
   }

}

但是这个逻辑也会输出之前保存的学生的名字和标记!如果我在调用reducer之前就知道reducer的输入键的数量,那么我就可以解决这个问题,这样当reducer在最后一个键(name)上迭代时,我就可以调用output.collect(name,new IntWritable(maxMark))一次。。

那么,有没有一种方法可以找到减速器的输入键的数量?或者,从减速器中获得单个输出的其他替代方案是什么?

您需要两个map reduce作业。第一个将按名称汇总标记,而不考虑组。然后,您可以使用映射器运行一个作业,该映射器可以转换键和值,因此键是上一步中的标记的总和,请确保使用递减比较器。将此作业配置为仅使用单个reducer任务,并且它可以将自身标记为忽略除第一个reduce调用之外的所有调用。

相关内容

  • 没有找到相关文章

最新更新