如何将单个键值对作为reducer的输出

时间:2013-12-11 00:24:55

标签: hadoop mapreduce

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

Harry Maths 80

Harry Physics 67

雏菊科学89

Daisy Physics 90

Greg Maths 70

Greg Chemistry 79

我知道reducer迭代每个唯一键,因此我将获得3个带有名称和总标记的输出键值对。但我需要具有总分最高分的学生的名称即。 减速机输出 - >雏菊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)); 一次..

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

1 个答案:

答案 0 :(得分:2)

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