我们可以在hadoop mapreduce中进行比较

时间:2014-03-20 07:51:45

标签: hadoop mapreduce

我的问题是关于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输出)?

请告诉我这样做的所有可能方法。

我很困惑,因为这里的键是唯一的,值是唯一的。

4 个答案:

答案 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变量与您获得的值对进行比较,直到扫描完所有的键和值对。完成所有操作后,将其作为输出键发出。