问题描述
(结尾处附有代码)
我无法理解以下有关字数统计问题的代码。据我了解(请纠正,如果我错了),映射器会在元组的一组行上生成输出,
"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文档中示例的链接,该示例进一步说明了每个功能: