mapreduce不能按值排序[python]

23c0lvtd  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(354)

目的是按输入的值(即json文件)对(键、值)进行排序。我有4个方法,两对Map器和还原器。
输入类似于

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

Map器和减速机的第一级输出类似于

A 1
B 2
C 3
D 4

我想要的是

1 A
2 B
3 C
4 D

在第一阶段,按键排序可以正常工作,但是在第二阶段,我尝试将value作为键,会抛出一个错误
typeerror:at 0x7fa43ea615a0>不可json序列化
我使用的代码是

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()

当键和值反转时,代码在第二个Map器中中断。如有任何意见,将不胜感激。

vlju58qv

vlju58qv1#

为什么不干脆 yield sum(frns), uid 在第一个减速器里?
但是,在第二个Map器中,您试图生成一个生成器,而不是一个整数。遍历生成器以生成frns,uid。像这样:

for num in frns:
    yield num, uid

相关问题