我被要求修改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);
}
1条答案
按热度按时间vybvopom1#
您可以定义javaMap结构或guava multiset,并计算每个Map器中每个单词的出现次数。然后,当Map程序结束时,随后运行的cleanup方法可以发出所有部分和作为map的输出,如下所示(伪代码):
引用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)。
除此之外,您还可以考虑使用组合器作为替代方案。