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

问题描述

(结尾处附有代码

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

"the",1
"wheels",1
"on",1
"the",1
"bus",1
"go",1
"round",1
"and",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()

解决方法

元组的和与列表中的和完全相同。通常,元组基本上只是不可变的列表。

由于此Wordcount类是从父MRJob类派生的,因此我们继承了run函数。此功能在抽象层后面为我们进行了一些汇总。

mapper函数的用法与您说的一样,使用python生成器函数一次返回列表中的每个元组。

因此MRJob包的run函数将在每一行上调用mapper,为您汇总信息,以便将reducer暴露于参数(单词,计数),其中word是来自文本输入的单词,而counts是列表映射器返回的值。即Wordcount.run()将(在映射步骤之后)进行函数调用:reducer(“ the”,[1,1]),然后reducer将“返回”元组(“ the”,2)(由于求和([1,1])= 2)。这将针对您的文本输入中的每个单词完成。

值得注意的是,MrJob函数允许您定义一个组合器函数,该函数充当映射和归约之间的中间人,并可能有助于理解该过程(并使复杂的作业更快一些)。以下是MRJob文档中示例的链接,该示例进一步说明了每个功能:

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