【问题标题】:Understanding Map Reduce - work flow in the below code了解 Mapreduce - 以下代码中的工作流程
【发布时间】:2021-01-14 07:50:48
【问题描述】:

(代码附在最后)

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

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

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

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()

【问题讨论】:

  • 您能否更具体地说明问题是什么?

标签: python sum reduce


【解决方案1】:

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

因为这个 Wordcount 类是从父 MRJob 类派生的,所以我们继承了 run 函数。这个函数在抽象层后面为我们做了一些聚合。

mapper 函数按照您所说的方式工作,使用 python 生成器函数一次返回列表中的每个元组。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多