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

hadoop字数并获取出现的最大字数,hadoop,max,word-count,Hadoop,Max,Word Count,我是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 v

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

  }
公共静态类Reduce扩展Reducer
{
int max_sum=0;
文本最大发生次数键;
公共void reduce(文本键、Iterable值、上下文)
抛出IOException、InterruptedException
{
整数和=0;
for(可写入值:值)
{
sum+=val.get();
}
如果(总和>最大总和)
{
最大和=和;
最大发生次数\u键=键;
}
write(max_occurrent_key,new IntWritable(max_sum));
//write(key,newintwriteable(sum));
}
}

但它没有给出正确的输出。
有人能帮助plz吗?

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

你可能应该修改如下:

  • 在构造时初始化
    max\u occurrent\u键
    变量(为空文本)
  • 调用
    max\u occurrented\u key.set(key)
    而不是使用equals赋值-reduce方法的所有迭代都会重用关键参数的引用,因此实际对象将保持不变,只是每次迭代都会修改底层内容
  • 重写cleanup
    方法
    并移动context.write调用该方法-这样每个reducer只能得到一个K,V输出对
例如:

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

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

非常感谢。但我有一个问题:你能不能请你举个例子,看看你的第三点……我不明白。在构造时初始化max\u occurrend\u key意味着将它声明为类WordCount的公共变量???你能举个例子吗?添加一个例子和一点解释。如果你需要用m解释什么,请告诉我ore DETAILS谢谢你。我怎样才能得到前2个常用词?就像对于给定的输入,输出应该是::b 4和c 2…一般来说,我怎样才能得到前N个常用词?对于前N个常用词,你需要在你的减缩器中维护一个“优先级集”,或者运行一个减缩器(对于较大的数据集不实用),或输出每个减速器的Top N,并运行第二个作业,第一个作业作为输入,以获得实际Top N