如何在EC2上运行MapReduce作业时获取文件名?

1 投票
1 回答
2952 浏览
提问于 2025-04-17 06:00

我正在学习弹性MapReduce,并从亚马逊教程部分提供的单词拆分器示例开始(下面有代码)。这个示例会计算所有输入文档中所有单词的数量。

但是我想要的是按文件名输出单词计数,也就是说,我只想知道某个特定文档中某个单词的数量。由于用于单词计数的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)

1 个回答

5

在典型的单词计数示例中,处理文件的名称是被忽略的,因为作业的输出包含了所有输入文件的合并单词计数,而不是按文件来统计。不过,如果想要按文件来统计单词数量,就必须使用输入文件的名称。使用Python的映射器可以通过 os.environ["map.input.file"] 命令获取文件名。有关任务执行环境变量的列表,可以在这里找到。

映射器不仅仅输出键值对 <Hello, 1>,还应该包含正在处理的输入文件名称。可以输出的内容是 <input.txt, <Hello, 1>>,其中 input.txt 是键, <Hello, 1> 是值。

这样,特定文件的所有单词计数将由一个单独的归约器处理。归约器必须对该文件的单词计数进行汇总。

像往常一样,组合器可以帮助减少映射器和归约器之间的网络通信,从而加快完成作业的速度。

想了解更多文本处理的算法,可以查看《数据密集型文本处理与MapReduce》

撰写回答