2017-06-22 39 views
0

目的是通過輸入值(它是一個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() 

在第二映射器的碼符時的鍵和值是相反的。任何意見將不勝感激。

+0

是這樣的:TypeError:在0x7fa43ea615a0不是JSON序列化真的完整的錯誤信息? –

+0

對不起。完整的錯誤消息是 ** TypeError:<生成器對象 at 0x7efbfe824a50>不是JSON可串行化** – Sid

+0

發佈帶有堆棧跟蹤的完整錯誤消息。什麼是'線'?我很確定你需要在'mapper'中實現這個生成器。 –

回答

0

爲什麼不只是yield sum(frns), uid在第一個減速機?

但是,在您的第二個映射器中,您試圖產生一個生成器,而不是一個整數。遍歷發電機產生frns,uid。這樣的事情:

for num in frns: 
    yield num, uid 
+0

我厭倦了,但我在某處看到,在第二階段應該發生逆轉鍵。但是,我提出了同樣的錯誤。 – Sid

+0

在mapper_two中,您試圖產生不是json序列化的generator對象。你需要遍歷發生器以產生frns,uid。看到上面的編輯。 – Bill

+0

我改變所述第二減速器 'DEF reducer_two(個體,浮動利率,UID): 在浮動利率民: 收率NUM,uid' 但現在它引發錯誤 **類型錯誤:「詮釋'object is not iterable ** – Sid