【发布时间】: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