如何在Hadoop中使用Secondary Sort找到第二个最高温度?

时间:2016-09-12 05:32:08

标签: hadoop mapreduce

在次要排序示例年份和温度。我们把年份和温度作为复合键。并打印第一个键值对以打印当年的最高温度。

  

1900 35°C
  1900 34°C
  1900 34°C
  ...
  1901年36°C
  1901年35°C

protected void reduce(IntPair key, Iterable<NullWritable> values,
Context context) throws IOException, InterruptedException {
    context.write(key, NullWritable.get());
}

现在,如果我们想要打印特定年份的第二个最大值,我们怎么能这样做。

1 个答案:

答案 0 :(得分:0)

设置方式您无法执行此操作,temperature也需要设置为值,因此您的reduce方法签名需要更改为:< / p>

protected void reduce(IntPair key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
    ...
}

使用辅助排序的目标是使用复合键对进行排序,以便设置NullWritable,因为该值将阻止此工作。一旦你有了温度值,你可以迭代它们并忽略第一个值,从而获得第二个最大值。例如:

protected void reduce(IntPair key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
    boolean first = true;
    for (IntWritable temp : values) {
        if (!first) {
            context.write(key, temp);
            return;
        } else {
            first = false;
        }
    }
}

既然温度是你可以迭代它们的值,忽略第一个,写出第二个并退出。

注意:此代码假定温度没有重复。