【问题标题】:Mapreduce cannot sort by value [python]Mapreduce 无法按值排序 [python]
【发布时间】:2017-06-22 19:39:46
【问题描述】:

目的是按输入的值对(key, value)进行排序,是一个json文件。我有 4 种方法,两对映射器和减速器。

输入类似于

{ 
  id: 1, 
  user: {
    friends_count: 1
  } 
}

mapper 和 reducer 第一阶段的输出类似于

A 1
B 2
C 3
D 4

我想要的是

1 A
2 B
3 C
4 D

在第一阶段按键排序工作正常,但在第二阶段,我尝试将值作为键,抛出一个错误,上面写着

TypeError: at 0x7fa43ea615a0> is not JSON serializable

我使用的代码是

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

class MRFrnsCounter(MRJob):
    def steps(self):
        return [
            MRStep(mapper=self.mapper,
                   reducer=self.reducer),
            MRStep(mapper = self.mapper_two,
                    reducer = self.reducer_two)
        ]

def mapper(self, _, line):
    f = json.loads(line)
    (uid, frns) = f["id"],f["user"]["friends_count"]
    yield (uid), (frns)

def reducer(self, uid, frns):
    yield uid, sum(frns)

def mapper_two(self, uid, frns):
    yield (frns), (uid)

def reducer_two(self, frns, uid):
    yield (frns), uid

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

当键和值颠倒时,代码在第二个映射器中中断。任何意见将不胜感激。

【问题讨论】:

  • 这是:TypeError: at 0x7fa43ea615a0> is not JSON serializable 真的是完整的错误信息吗?
  • 对不起。完整的错误消息是 TypeError: at 0x7efbfe824a50> is not JSON serializable
  • 发布带有堆栈跟踪的完整错误消息。 line 是什么?我很确定您需要在 mapper 中实现该生成器。
  • 请看我下面的评论

标签: python json hadoop mapreduce mapper


【解决方案1】:

为什么不在第一个减速器中只使用yield sum(frns), uid

但是,在您的第二个映射器中,您试图生成一个生成器,而不是一个整数。遍历生成器以产生 frns、uid。像这样的:

for num in frns:
    yield num, uid

【讨论】:

  • 我对此感到厌烦,但我在某处读到应该在第二阶段发生反转键。但是,我遇到了同样的错误。
  • 在 mapper_two 中,您试图生成生成器对象,该对象不是 json 可序列化的。您需要遍历生成器以产生 frns、uid。请参阅上面的编辑。
  • 我把第二个reducer改成了def reducer_two(self, frns, uid): for num in frns: yield num, uid但是现在它抛出了错误TypeError: 'int' object is not iterable
  • 但是,如果我将 uid 作为键,它会以一种非常奇怪的方式对输出进行排序。 uid, 1 uid, 123 uid, 13 uid, 235 uid, 28 等等..我对引擎盖下发生的事情感到困惑。
  • MapReduce 不对 reducer 输出进行排序。在这里试试:stackoverflow.com/questions/14322381/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多