hadoop字数统计并得到最大的字数

时间:2013-01-14 11:38:45

标签: hadoop max word-count

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

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

a 1
b 4
c 2

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

b 4

这里是我的reducer函数::

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

  }

}

但它没有给出正确的输出。 任何人都可以帮助PLZ吗?

1 个答案:

答案 0 :(得分:5)

到目前为止,您在每个reduce函数的末尾都写出了最大值 - 因此每个reducer只能输入一个条目。当您将密钥的引用复制到max_occured_key变量(而不是复制值)时,您也遇到了引用重用问题。

你应该修改如下:

  • 在构建时初始化max_occured_key变量(到空文本)
  • 调用max_occured_key.set(key);而不是使用equals赋值 - 引用key参数重用于reduce方法的所有迭代,因此实际对象将保持不变,只是每次迭代将修改基础内容< / LI>
  • 覆盖清理method并将context.write调用移动到该方法 - 这样每个reducer只能获得一个K,V输出对。

例如:

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

一旦所有数据都通过map或reduce任务传递,就会调用cleanup方法(并且每个任务实例调用一次(因此,如果你给了10个reducers,那么将为每个实例调用此方法)。