首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
华为云
V2EX  ›  Java

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

  •  
  •   louxinbo · 54 天前 · 621 次点击
    这是一个创建于 54 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在写 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。只好上来问大神。
    5 回复  |  直到 2018-08-23 11:35:47 +08:00
        1
    shaohan0228   54 天前
    wordcount 只照着基本例子超了一遍,key 文件名; value Map key 为单词,value 为词频,这样行么
        2
    louxinbo   54 天前
    @shaohan0228 谢谢回复。断句有点迷糊。能不能再解释下。谢了
        3
    louxinbo   54 天前
    我的 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);

    }
    }
        4
    jieee   54 天前   ♥ 1
    词和文件名做 key
        5
    louxinbo   54 天前
    @jieee 谢谢。词和文件名做 key, 问题解决了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2271 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 20ms · UTC 12:11 · PVG 20:11 · LAX 05:11 · JFK 08:11
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1