【问题标题】:In java map-reduce, how to print the key with max value? [duplicate]在 java map-reduce 中,如何打印具有最大值的键? [复制]
【发布时间】:2018-03-10 16:12:02
【问题描述】:

我正在尝试修改现有代码,我设法打印键(分组)和值(出现次数),但我只需要提取一个具有最大值(出现次数)的键。我不是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));

  }
}

【问题讨论】:

  • 你的地图在代码中的什么位置?
  • 我认为您应该将问题更改为 Java MAP-REDUCE,而不是 Java 集合 Map
  • 改了问题,我不重复了。
  • 这不是重复的(因为 Varun 更改了标题),这是一个与 Hadoop Map Reduce 相关的问题,它不像从 java Map 中获取最大值那么简单。 Map Reduce 是分布式的,会带来不同的问题。

标签: java hadoop hashmap


【解决方案1】:

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

 @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));

  }

【讨论】:

  • 谢谢@markg。我会试试这个(y)
  • 如果你运行多个reducer,我的做法是将每个reducer的输出写入一个文件,然后运行hadoop命令将“部分文件”合并为一个,然后你可以阅读到某个地方。另一种(更好的 IMO)方法是类似于 HBase 作为输出格式,因此您可以在作业运行后轻松访问应用程序的输出数据。
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 2020-05-30
  • 1970-01-01
  • 2015-01-08
  • 2019-05-23
  • 2019-05-26
  • 2016-08-15
  • 1970-01-01
相关资源
最近更新 更多