我是hadoop mapreduce的新手。我有一个要求,让我们说,我想找到学生的名字与最高的分数。考虑示例数据集
哈利数学80
哈利物理67
雏菊科学89
黛西物理学90
格雷格数学70
格雷格化学79
我知道reducer对每个惟一键进行迭代,因此我将得到3个输出键值对,其中包含name和total标记。但我需要的是总成绩最高的学生的名字,即减速机输出->雏菊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));一次。。
那么,有没有办法找到减速机的输入键数?或者,还有什么其他方法可以从减速机获得一个输出?
1条答案
按热度按时间yjghlzjz1#
你需要两份Map缩小工作。第一个将按姓名加总分数,不分组别。然后可以使用Map器运行一个作业,该Map器将键和值进行转换,因此键是上一步中的标记的总和,确保使用降序比较器。将此作业配置为仅使用单个reducer任务,它可以将自身标记为忽略除第一个reduce调用以外的所有调用。