2016-09-12 8 views
0

在二级排序示例年和温度。我们把年份和温度作为一个复合关键。并打印第一个键,值对以打印当年的最高温度。如何使用Hadoop中的Secondary Sort找到第二最高温度?

1900 35℃
1900 34℃
1900 34℃
...
1901 36℃
1901 35℃

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

现在,如果我们想要在特定年份打印第二个最大值,我们如何才能做到这一点。

回答

0

的方式,这是设置你不能做到这一点,temperature也需要被设置为值,所以你reduce方法签名将需要更改为类似:

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

现在温度值可以迭代通过它们,忽略第一个,写出第二个并退出。

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

相关问题