如何在EC2上运行MapReduce作业时获取文件名?
我正在学习弹性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》。