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

omvjsjqw  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(257)

我的问题是关于在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的输出)?
请告诉我所有可能的方法。
我很困惑,因为这里的键是唯一的,值是唯一的。

4xy9mtcn

4xy9mtcn1#

不明白,你想得到输出中的最大值是48吗?
如果是,只需编写一个Map器,定义一个变量max,迭代输出文件,如果找到大于max的值,只需将其设置为max,那么max就是最大值。

qlzsbp2j

qlzsbp2j2#

代码如下:

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));
}
hrysbysz

hrysbysz3#

您可以在reduce函数上方的reducer类中用初始值定义一个私有静态变量max。然后将reduce函数中的这个max变量与获得的值对进行比较,直到扫描完所有键和值对。一旦一切都完成了,它就会作为输出键发出。

lqfhib0f

lqfhib0f4#

拉吉:如果我理解正确的话,你有一个数据集,包含了不同年份的温度记录,你写了一个Map,得到了每年的最高温度。现在从这个记录,你想写一个减速机来获得最大值吗?
你可以写一些类似这样的东西来比较值:

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:我是在Hadoop2上写的,如果你使用的是早期版本,你可能会考虑使用hadoop类。有些可能会被否决。
谢谢

相关问题