目的是通過輸入值(它是一個json文件)對鍵值進行排序。我有4種方法,兩對映射器和減速器。Mapreduce無法按值排序[python]
輸入類似於
{
id: 1,
user: {
friends_count: 1
}
}
輸出變換器和減速的第一階段是一樣的東西
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:在0x7fa43ea615a0不是JSON序列化真的完整的錯誤信息? –
對不起。完整的錯誤消息是 ** TypeError:<生成器對象 at 0x7efbfe824a50>不是JSON可串行化** –
Sid
發佈帶有堆棧跟蹤的完整錯誤消息。什麼是'線'?我很確定你需要在'mapper'中實現這個生成器。 –