我是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获得单个输出的其他替代方法是什么?
答案 0 :(得分:2)
您需要两个地图缩减作业。第一个将按名称总计标记,而不考虑组。然后,您可以使用映射器运行作业,该映射器可以转换键和值,因此键是上一步中的标记总和,确保使用降序比较器。将此作业配置为仅使用单个reducer任务,它可以标记自己以忽略除第一次reduce之外的所有操作。