python - Mapreduce无法按值排序[python]

标签 python json hadoop mapreduce mapper

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

输入类似于

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

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

最佳答案

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

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

for num in frns:
    yield num, uid

关于python - Mapreduce无法按值排序[python],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44708037/

相关文章:

python - 新手? : is this a variable, 函数,还是什么?

java - 检索到的数据未显示在 TextView 中

hadoop - Elasticsearch 和 Hadoop?

Hadoop 伪分布式模式 - Datanode 和 tasktracker 未启动

python - UDF 中的 Pyspark 和局部变量

python - 如何使用 matplotlib 子图绘制每一行的线图?

python - 为什么替换多个连续的空格也会删除 Python 中的换行符?

c# - 在 LINQ 中仅将某些列返回到 JSON

java - 如何从 json 数组获取 Json 对象并将其与模型类一起使用

hadoop - 如何在HDFS中的文件上使用linux split命令?