1

我正在学习弹性 mapreduce,并从 Amazon 教程部分中提供的 Word Splitter 示例开始(代码如下所示)。该示例为提供的所有输入文档中的所有单词生成字数。

但我想通过文件名获得字数的输出,即仅在一个特定文档中的字数。由于用于字数统计的 python 代码从标准输入获取输入,我如何判断哪个输入行来自哪个文档?

谢谢。

#!/usr/bin/python

import sys
import re

def main(argv):
  line = sys.stdin.readline()
  pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
  try:
    while line:
      for word in  pattern.findall(line):
        print  "LongValueSum:" + word.lower() + "\t" + "1"
      line =  sys.stdin.readline()
  except "end of file":
    return None
if __name__ == "__main__":
  main(sys.argv)
4

1 回答 1

5

在典型的 WordCount 示例中,映射文件正在处理的文件名被忽略,因为作业输出包含所有输入文件的合并字数,而不是文件级别的。但是要获得文件级别的字数,必须使用输入文件名。使用 Python 的映射器可以使用os.environ["map.input.file"]命令获取文件名。任务执行环境变量列表在这里

映射器不仅应将键/值对作为 发出<Hello, 1>,还应包含正在处理的输入文件名。以下可以是 map 发出的<input.txt, <Hello, 1>>,其中 input.txt 是键,<Hello, 1>是值。

现在,特定文件的所有字数都将由单个 reducer 处理。然后,reducer 必须聚合该特定文件的字数。

像往常一样,Combiner 将有助于减少 mapper 和 reducer 之间的网络通信,并更快地完成工作。

查看Data-Intensive Text Processing with MapReduce了解更多关于文本处理的算法。

于 2011-11-10T07:17:09.037 回答