我是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调用之外的所有调用。