您好我正在编写map reduce代码来查找最高温度。问题是我得到的最高温度却没有相应的密钥。
public static class TemperatureReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
Text year=new Text();
int maxTemperature=Integer.MIN_VALUE;
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
for(IntWritable valTemp:values) {
maxTemperature=Math.max(maxTemperature, valTemp.get());
}
//System.out.println("The maximunm temperature is " + maxTemperature);
context.write(year, new IntWritable(maxTemperature));
}
}
mapper imagin like
1955 52
1958 7
1985 22
1999 32
等等。
它会覆盖密钥并打印所有数据。我只想要最高温度和一年。
答案 0 :(得分:1)
我发现您的代码示例存在一些问题:
重置reduce方法中的maxTemperature(作为第一个语句),此时你有一个错误,它将输出所有前面的键/值所见的最高温度
您在哪里配置year
的内容?事实上你不需要,只需拨打context.write(key, new IntWritable(maxTemperature);
作为输入键是年份
您可能想要创建一个IntWritable实例变量并重新使用它,而不是在写出输出值时创建一个新的IntWritable(这是一个效率问题而不是问题的潜在原因)