使用(java编程)在hadoop中查找最大整数值

cgvd09ve  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(324)

我最近开始在hadoop工作,我刚刚学到了一些关于hadoop的基本理论知识。我正在尝试解决一个任务,其中输入应在文本文件中给出,例如input.txt(1 10 37 5 98 100等)
我需要找到最大的整数在给定的输入(即整数类型)。我尝试在arraylist中传递输入,以便将第一个整数与所有整数的其余部分进行比较(使用for循环)。
1) 这样能找到解决办法吗?如果是,我无法在hadoop中创建arraylist,需要一些提示:-)
2) 我们可以只打印“键”而不打印键值对吗?如果是,请帮助我。我试图在代码减少功能不打印它,但我得到一些错误。
请给我一些建议,让我能继续前进。谢谢您

qqrboqgw

qqrboqgw1#

在Map步骤中,可以将所有数字Map到一个键。然后在reduce步骤中,只需取最大值即可。reduce步骤将为给定键传递一个可iterable的值集合—无需创建自己的arraylist。

mzmfm0qo

mzmfm0qo2#

为此,最好有一个减速机。
为了确保所有数字都到达同一个减速机,您必须做两件事:
为Map器中的所有输入值发出相同的键
将reduce tasks设置为零。
你呢 map() 方法可能如下所示:

@Override
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
          context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
           }

在你的 Reduce 同学们,有一个财产 max ,类似于: Long max 以及 reduce() 方法可能如下所示:

@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
          context.write(new Text("MyAwesomeKey"), key); // assuming that your number is being read in the key
           }

然后覆盖 run() 当我们超越 reduce() :

public void run(Context context) throws IOException, InterruptedException {
    setup(context);
    while (context.nextKey()) {
      reduce(context.getCurrentKey(), context.getValues(), context);
    }
    context.write(new LongWritable(max),new Text("")); // write the max value
    cleanup(context);
  }

要将reduce tasks设置为1,请在作业的 run() ,注意这与上述不同 run() :

job.setNumReduceTasks(1);

注意:以上所有代码都遵循新的mapreduceapi,我相信使用旧的mapredapi,在reducer完成它的工作之后,我们将无法拥有一个钩子点,因为我们可以通过重写 run() 减速机。

相关问题