减少Spark上的操作

时间:2016-11-07 23:25:50

标签: python apache-spark pyspark reduce

我正在尝试使用3个值来减少RDD,因此,首先,我使用以下格式映射rdd

a = mytable.rdd.map(lambda w: (w.id,(w.v1,w.v2,w.v3)))

然后在下一步中使用以下代码减少它

b = a.reduceByKey(lambda a,b,c: (a[0] +','+ a[1],b[0] +','+ b[1],c[0] +','+ c[1]))

然而,我收到的错误是: TypeError :()只需要3个参数(给定2个)

我的目标是添加该rdd的所有值,例如,如果我的rdd具有以下值:

[(id1, ('a','b','c')),(id1', ('e','f','g'))]

在reduce之后,我希望结果按此顺序排列:

[(id1, ('a,d','b,e','c,f'))]

由于

1 个答案:

答案 0 :(得分:2)

最佳解决方案可表示为:

a.groupByKey().mapValues(lambda vs: [",".join(v) for v in  zip(*vs)])

其中,初始groupByKey将数据分组到等效于:

的结构中
('id1', [('a','b','c'), ('e','f','g')])

zip(*vs)将值转换为:

[('a', 'e'), ('b', 'f'), ('c', 'g')]

join的理解联系每个元组。

reduceByKey这里真的不是正确的选择(考虑复杂性),但一般来说它需要两个参数的函数,所以lambda a, b, c: ...不会这样做。我相信你想要这样的东西:

lambda a, b: (a[0] + "," + b[0], a[1] + "," + b[1], a[2] + "," + b[2])