Ron*_*nin 2 hadoop max word-count
我对hadoop很新.我已完成字数统计,现在我想做一个修改.
我想得到文本文件中最常出现的单词.如果,正常的字数统计程序给出一个输出:
a 1
b 4
c 2
Run Code Online (Sandbox Code Playgroud)
我想编写只给我输出的程序
b 4
Run Code Online (Sandbox Code Playgroud)
这里我的减速机功能::
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));
}
Run Code Online (Sandbox Code Playgroud)
}
但它没有给出正确的输出.任何人都可以帮助PLZ吗?
到目前为止,您在每个reduce函数的末尾都写出了最大值 - 因此每个reducer将获得多个条目.当您将密钥的引用复制到max_occured_key变量(而不是复制值)时,您也遇到了引用重用问题.
你应该修改如下:
max_occured_key在构造时初始化变量(到空文本)max_occured_key.set(key);而不是使用equals赋值 - 引用key参数重用于reduce方法的所有迭代,因此实际对象将保持不变,只是每次迭代将修改基础内容method并将context.write调用移动到该方法 - 这样每个reducer只能获得一个K,V输出对.例如:
@Override
protected void cleanup(Context context) {
context.write(max_occured_key, new IntWritable(max_sum));
}
Run Code Online (Sandbox Code Playgroud)
一旦所有数据都通过map或reduce任务传递,就会调用cleanup方法(并且每个任务实例调用一次(因此,如果你给了10个reducers,那么将为每个实例调用此方法).
| 归档时间: |
|
| 查看次数: |
5081 次 |
| 最近记录: |