为啥 MapReduce 第二份工作不会排序?

Posted

技术标签:

【中文标题】为啥 MapReduce 第二份工作不会排序?【英文标题】:Why MapReduce second job won't sort?为什么 MapReduce 第二份工作不会排序? 【发布时间】:2019-12-10 22:27:31 【问题描述】:

我对这段代码有一点问题,第一份工作运行良好,将每个客户的价格总和相加,但在第二份工作中,它应该对我的价格进行排序,但我的控制台仍然没有产生第一份工作,为什么?

from mrjob.job import MRJob
from mrjob.step import MRStep


class CustomerCount(MRJob):
    def steps(self):
        return [
            MRStep(mapper=self.mapper_initial,
                   reducer=self.reducer_initial),
            MRStep(mapper=self.mapper_sort,
                   reducer=self.reducer_sort)
        ]

    def mapper_initial(self, _, line):
        (customerID, price) = line.split(',')[0:3:2]
        yield customerID, float(price)

    def reducer_initial(self, customerID, prices):
        yield customerID, sum(prices)

    def mapper_sort(self, customerID, price):
        yield '%04.02f' % float(price), customerID

    def reducer_sort(self, price, customersID):
        for val in customersID:
            yield val, price


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

数据行看起来像这样:(我对第一个和第二个元素感兴趣):

44,8602,37.19
35,5368,65.89

【问题讨论】:

【参考方案1】:

您的第二个 MR 步骤映射器正在将价格作为键写入。因此,所有具有相同键的客户 ID 都会被排序,但数据不会按客户 ID 排序。要验证这个假设,请尝试与具有相同价格的几个客户一起运行它。 要按照您要求的方式获得输出,您可以在映射器上发送常量键(例如常量字符串“1”)并编写自定义比较器调用来对价格和客户 ID 进行排序。

【讨论】:

以上是关于为啥 MapReduce 第二份工作不会排序?的主要内容,如果未能解决你的问题,请参考以下文章

我的第二份工作。

Circle Ci:第二份工作从未开始过?

我找到第二份工作后的工作时间及其待遇.

有关工作和生活的感悟(写在第二份工作一年半之际)

第二份python答案

Jquery 可排序列表不会序列化,为啥?