在java map-reduce中,如何以最大值打印密钥?

时间:2017-09-28 19:51:46

标签: java hadoop hashmap

我试图修改现有代码,我设法打印密钥(分组)和值(出现次数),但我只需要提取一个具有最大值(出现次数)的密钥。我不是Java专家,所以请原谅我没有正确解释这个问题。

当前输出:

994290  5
994380  33
994410  1
994440  11
995010  2
995030  5

预期:

994380  33

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MaxTemperatureReducer
  extends Reducer<Text, IntWritable, Text, IntWritable> {

  @Override
  public void reduce(Text key, Iterable<IntWritable> values,
      Context context)
      throws IOException, InterruptedException {

    int count = 0;
    for (IntWritable value : values) {
        if(value.get() == 9999)
          count++;
    }
    context.write(key, new IntWritable(count));

  }
}

1 个答案:

答案 0 :(得分:0)

你的代码是Map Reduce Job中的Reducer,所以在Hadoop框架中,在Reducer的reduce方法(你发布的那个)的范围内,你只有一个密钥,有一堆值。您必须聚合所有reducer的输出(来自context.write的输出...),然后从具有最大值的某个地方获取密钥(全局)。将数据写入HBase或另一个HDFS文件应该可以解决问题。 如果你以某种方式让所有的映射器写入一个reducer(我不确定是否可能),那么你可以保持一个Max的最大值和一个相应键的变量。这在MapReduce中很复杂,因为这种方法可能分布在许多节点上。 也许这样,除非您可能需要将变量移动到类级别,如果您有多个reducer,这仍然无法解决您的问题。

 @Override
  public void reduce(Text key, Iterable<IntWritable> values,
      Context context)
      throws IOException, InterruptedException {

    int max= 0;
String keyWithMax="";
    for (IntWritable value : values) {
        if(value.get() > max){
          max= value.get();
          keyWithMax=key.toString();
          }
}
    context.write(keyWithMax, new IntWritable(max));

  }