我的问题是关于mapreduce的比较。
这里我有一个样本天气数据
0067011990999991950051507004+68750+023550FM-12+038299999V0203301N00671220001CN9999999N9-04001+99999999999
0043011990999991950051512004+68750+023550FM-12+038299999V0203201N00671220001CN9999999N9+04221+99999999999
0043011990999991950051518004+68750+023550FM-12+038299999V0203201N00261220001CN9999999N9+04111+99999999999
0043012650999991949032412004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+01111+99999999999
0043012650999991949032418004+62300+010750FM-12+048599999V0202701N00461220001CN0500001N9+04781+99999999999
我能够处理,并且我在一年内获得了最高温度。
输出:
1901 46
1902 39
1910 46
1911 44
1915 48
1916 30
1949 47
1950 42
1960 35
1970 36
1980 35
1990 45
2000 46
是否有可能比较上述年份的最高温度(我们需要处理的mapreduce输出)?
请告诉我这样做的所有可能方法。
我很困惑,因为这里的键是唯一的,值是唯一的。
答案 0 :(得分:0)
没有得到你,你想获得输出中的最大值48吗?
如果是,只需编写映射器,定义变量max,迭代输出文件,如果找到大于max的值,则将其设置为max。然后max是最大值。
答案 1 :(得分:0)
代码如下:
private int maxYear = 0;
private int maxTemperature = Integer.MIN_VALUE;
@Override
protected void map(LongWritable key, Text value, Context ctx) throws IOException, InterruptedException {
String[] tokens = value.toString().trim().split(",");
int year = Integer.valueOf(tokens[0]);
int temperature = Integer.valueOf(tokens[1]);
if (temperature > maxTemperature) {
maxTemperature = temperature;
maxYear = year;
}
}
@Override
protected void cleanup(Context ctx) throws IOException, InterruptedException {
System.out.println("maxYear:" + maxYear + ",maxTemperature:" + maxTemperature);
ctx.write(new IntWritable(maxYear), new IntWritable(maxTemperature));
}
答案 2 :(得分:0)
拉吉: 如果我理解正确的话,你会有一个数据集包含不同年份的温度记录,你写了一个Mapper来获取每年的最高温度。现在从这条记录中,你想写一个减速器来获得最大值?
您可能想要将减速器写成这样的值来比较值:
Text max = Values.next();
while(Values.hasNext()){
Text current = Values.next();
if(current.compareTo(max) > 0)
max = current;
}
output.collect(key, (Text) new org.apache.hadoop.io.Text(max));
希望这有帮助!
PS:我在Hadoop 2上写过这个,你可能想考虑使用hadoop类,如果你使用的是早期版本。有些可能已被弃用。
由于
答案 3 :(得分:0)
您可以使用初始值在reduce函数上方的reducer类中定义私有静态变量MAX。然后将reduce函数内的MAX变量与您获得的值对进行比较,直到扫描完所有的键和值对。完成所有操作后,将其作为输出键发出。