hadoop字数并获取出现的最大字数

e5nszbig  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(396)

我对hadoop非常陌生。我已经完成了字数计算,现在我想做一个修改。
我想得到文本文件中出现最多的单词。如果正常的字数计算程序输出:

  1. a 1
  2. b 4
  3. c 2

我想写的程序,将只给我的输出

  1. b 4

我的减速机功能如下:

  1. public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable>
  2. {
  3. int max_sum=0;
  4. Text max_occured_key;
  5. public void reduce(Text key, Iterable<IntWritable> values, Context context)
  6. throws IOException, InterruptedException
  7. {
  8. int sum = 0;
  9. for (IntWritable val : values)
  10. {
  11. sum += val.get();
  12. }
  13. if(sum > max_sum)
  14. {
  15. max_sum = sum;
  16. max_occured_key = key;
  17. }
  18. context.write(max_occured_key, new IntWritable(max_sum));
  19. //context.write(key, new IntWritable(sum));
  20. }

}
但它并没有给出正确的结果。有人能帮忙吗?

5tmbdcev

5tmbdcev1#

您在每个reduce函数的末尾写出了到目前为止的最大值—因此每个reducer将获得不止一个条目。在将键的引用复制到max\u occurrend\u key变量(而不是复制值)时,也会遇到引用重用问题。
您可能应该修改如下:
初始化 max_occured_key 构造时的变量(到空文本)
呼叫 max_occured_key.set(key); 与使用equals赋值不同,reduce方法的所有迭代都会重用键参数的引用,因此实际对象将保持不变,只是每次迭代都会修改底层内容
覆盖清理 method 并将context.write调用移到该方法,这样每个减速机只能得到一个k,v输出对。
例如:

  1. @Override
  2. protected void cleanup(Context context) {
  3. context.write(max_occured_key, new IntWritable(max_sum));
  4. }

当所有数据都通过map或reduce任务后,就会调用cleanup方法(并且每个任务示例调用cleanup方法(因此,如果给定10个reducer,则每个示例都会调用此方法)。

相关问题