Hadoop 中使用 Hashmap 统计词频,会重复,求大神帮忙,在线等,挺急的

2018-08-23 09:57:34 +08:00
 louxinbo
在写 Hadoop 的一个作业,改写 wordcount 程序,要求统计每个词在不同文件中出现的次数。
我的思路是,mapper 中每个词作为 key,每个词的文件名作为 value
在 reducer 中,对 values 用 hashmap 统计文件名出现的次数。 最后遍历 hashmap。
例如两个文件 a.txt ,b.txt
a.txt
apple banana apple
b.txt
banana
对应 apple 这个 key,hashmap 应该的结果是{a.txt=2}
对应 banana 这个 key,hashmap 应该的结果是{a.txt=1,b.txt=1}
但是我得到的结果是{{a.txt=2}=1}
{{a.txt=1}=1,{ b.xtx=1}=1}
看起来好像是每一个 hashmap 都重复操作了一次
我去找我们老师,老师也找不到 bug。只好上来问大神。
2273 次点击
所在节点    Java
6 条回复
shaohan0228
2018-08-23 10:05:54 +08:00
wordcount 只照着基本例子超了一遍,key 文件名; value Map key 为单词,value 为词频,这样行么
louxinbo
2018-08-23 10:13:45 +08:00
@shaohan0228 谢谢回复。断句有点迷糊。能不能再解释下。谢了
louxinbo
2018-08-23 10:22:12 +08:00
我的 reducer 的代码,麻烦大家给看看,到底哪儿出错了。reduce 输入的 key 就是单词,输入的 values 就是文件名。
public class IntSumReducer
extends Reducer<Text,Text,Text,Text> {
private Text result = new Text();

public void reduce(Text key, Iterable<Text> values,
Context context
) throws IOException, InterruptedException {
Map<String,Integer> m = new HashMap<String,Integer>();
int count;
for (Text val : values) {
if(m.get(val.toString())!=null) {
count = m.get(val.toString())+1;
}else {
count = 1;
}
m.put(val.toString(), count);
}
result.set(m.toString());
context.write(key, result);

}
}
jieee
2018-08-23 11:09:52 +08:00
词和文件名做 key
louxinbo
2018-08-23 11:35:47 +08:00
@jieee 谢谢。词和文件名做 key, 问题解决了。
cangxiao
2019-05-26 09:44:07 +08:00
我觉得这个 reduce 没有什么问题啊,为什么会出现{{a.txt=1}=1,{ b.xtx=1}=1}这种结果呢?楼主现在应该是知道了吧,跟我讲讲吧!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/482390

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX