【问题标题】:hadoop word count and get the maximum occured wordhadoop 字数统计并获取出现的最大字数
【发布时间】:2014-07-23 13:30:57
【问题描述】:

我对 hadoop 很陌生。我已经完成了字数统计,现在我想做一个修改。

我想获取文本文件中出现次数最多的单词。如果,正常的字数统计程序给出一个输出:

a 1
b 4
c 2

我想编写只给我输出的程序

b 4

这里是我的减速器函数::

public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> 
{

 int max_sum=0;
 Text max_occured_key;

 public void reduce(Text key, Iterable<IntWritable> values, Context context) 
  throws IOException, InterruptedException 
  {
    int sum = 0;
    for (IntWritable val : values) 
    {
        sum += val.get();           
    }
    if(sum > max_sum)
    {
        max_sum = sum;
        max_occured_key = key;

    }

    context.write(max_occured_key, new IntWritable(max_sum));
    //context.write(key, new IntWritable(sum));

  }

}

但它没有给出正确的输出。 有人可以帮忙吗?

【问题讨论】:

    标签: hadoop max word-count


    【解决方案1】:

    您在每个 reduce 函数的末尾写出迄今为止的最大值 - 因此每个 reducer 将获得不止一个条目。当您将键的引用复制到您的 max_occured_key 变量(而不是复制值)时,您还会遇到引用重用问题。

    你应该修改如下:

    • 在构造时初始化 max_occured_key 变量(为空文本)
    • 调用max_occured_key.set(key);而不是使用equals赋值 - 对reduce方法的所有迭代重复使用key参数的引用,因此实际对象将保持不变,只是每次迭代都会修改底层内容
    • 覆盖清理 method 并将 context.write 调用移至该方法 - 这样您将只获得每个减速器的一对 K、V 输出。

    例如:

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

    一旦所有数据通过您的 map 或 reduce 任务,就会调用 cleanup 方法(并且每个任务实例都会调用该方法(因此,如果您提供 10 个 reducer,则将为每个实例调用此方法)。

    【讨论】:

    • 非常感谢。但我有一个问题:你能解释一下你的第三点吗……我没明白。并在构造时初始化 max_occured_key 意味着将其声明为 WordCount 类的公共变量???
    • 你能举个例子吗??
    • 添加了一个示例和更多解释。如果您需要更详细的解释,请告诉我
    • 谢谢伙计。如何获得前 2 个常用词?就像给定的输入一样,输出应该是 :: b 4 & c 2 ... 一般来说,我怎样才能得到前 N 个频繁词?
    • 对于前 N 个,您需要在减速器中维护一个“优先级集”,然后运行单个减速器(对于较大的数据集不实用),或者为每个减速器输出前 N 个并运行第二个作业以第一份工作作为输入以获得实际的前 n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2017-04-19
    相关资源
    最近更新 更多