hadoop wordcount,在map中求和

e4eetjau  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(324)

我被要求修改wordcount示例,以便每个mapper函数在传递之前将文件中出现的单词相加。例如,代替:

<help,1>
<you,1>
<help,1>
<me,1>

Map器的输出将是:

<help,2>
<you,1>
<me,1>

那么我是否要将单词添加到数组中,然后检查是否出现?还是有更简单的方法?

String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
    word.set(tokenizer.nextToken());
    context.write(word, one);
}
vybvopom

vybvopom1#

您可以定义javaMap结构或guava multiset,并计算每个Map器中每个单词的出现次数。然后,当Map程序结束时,随后运行的cleanup方法可以发出所有部分和作为map的输出,如下所示(伪代码):

setup() {
    Map<String,Integer> counts = new HashMap<>(); 
}

map() {
    for each word w {
        counts.put(w, counts.get(w)+1); //or 1, if counts.get(w) returns null
    }
}

cleanup() {
    for each key w of counts.keySet {
        context.write(w, counts.get(w));
    }
}

引用mapper文档(版本2.6.2):
hadoop map reduce框架为作业的inputformat生成的每个inputspilt生成一个map任务。Map器实现可以通过jobcontext.getconfiguration()访问作业的配置。
框架首先调用setup(org.apache.hadoop.mapreduce.mapper.context),然后为inputsplit中的每个键/值对调用map(object、object、context)。最后调用cleanup(context)。
除此之外,您还可以考虑使用组合器作为替代方案。

相关问题