如何使mrjob MapReduce类能够处理多个文件

2024-04-19 02:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力完成一项学校作业,我必须让mrjob MapReduce类为每个文件在一行上输出一个JSON对象,输出包含当前文件的信息

让我们考虑使用MR作业JapReduce类来计算文件中的字符、单词和行数的一般示例。

%%writefile textstats.py

from mrjob.job import MRJob

class TextStats(MRJob):
    def mapper(self, _, line):
        yield "words", len(line.lower().split())
        yield "chars", len(line)
        yield "lines", 1

    def combiner(self, key, counts_iter):
        yield key, sum(counts_iter)


    def reducer(self, key, counts_iter):
        yield key, sum(counts_iter)

if __name__ == '__main__':
    TextStats.run()

使用我的两个测试文本文件作为输入时,该代码的输出为:

"chars" 849
"lines" 14
"words" 140

如何编辑该类,使其输出如下

{"file_name" : "test1.txt", "chars" : 505, "lines" : 8, "words" : 80}
{"file_name" : "test2.txt", "chars" : 344, "lines" : 6, "words" : 60}

我知道您可以通过以下方式获取文件名:

import os
file_name = os.getenv('mapreduce_map_input_file')

谢谢你的建议


Tags: 文件keynameselfdef作业linefile