了解 Map Reduce - 以下代码中的工作流程

Understanding Map Reduce - work flow in the below code

(代码附在最后)

我无法理解下面的字数统计问题代码。据我了解(如果我错了,请更正),映射器将在元组中的一组行上生成输出,

"the", 1
"wheels", 1
"on", 1
"the", 1
"bus", 1
"go", 1
"round", 1
"and", 1
"round", 1

我试图了解 python sum 函数如何对这些单独的元组起作用,我已经看到列表上的 sum 示例,但在元组上找不到太多。也不应该在 reducer 中也有一个循环以确保它对所有单词执行操作吗?

from mrjob.job import MRJob
import re

WORD_REGEX = re.compile(r"\b\w+\b")

class Wordcount(MRJob):

    def mapper(self, _, line):
        words = WORD_REGEX.findall(line)
        for word in words:
            yield (word.lower(), 1)

    def reducer(self, word, counts):

        yield(word, sum(counts))

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

元组求和与列表求和完全相同。一般来说,元组基本上只是不可变的列表。

因为这个Wordcountclass是从父MRJobclass派生出来的,所以我们继承了运行函数。这个函数在抽象层后面为我们做了一些聚合。

映射器函数按照您所说的方式工作,return使用 python 生成器函数一次一个地处理列表中的每个元组。

所以 MRJob 包的 运行 函数将在每一行调用 mapper,为您聚合信息,以便 reducer 暴露给参数(单词,计数),其中单词是来自您的文本输入的单词,而 counts 是由映射器 return 编辑的值列表。即 Wordcount.run() 将(在映射步骤之后)进行函数调用:reducer("the", [1,1]),然后 reducer 将“return”元组(“the” , 2)(因为 sum([1,1])=2)。这将针对您文本输入中的每个单词完成。

值得注意的是,MrJob 函数允许您定义一个组合器函数,它充当映射和缩减之间的中间人,可能有助于理解该过程(并且还可以使复杂的作业更快一些)。下面是来自 MRJob 文档的示例 link,进一步解释了这些功能中的每一个:

https://mrjob.readthedocs.io/en/latest/guides/concepts.html