Python 减少火花操作
我试图用3个值来减少RDD,因此,首先,我用以下格式映射RDDPython 减少火花操作,python,apache-spark,pyspark,reduce,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的所有值,例如
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'))]
谢谢最佳解决方案可以表示为:
a.groupByKey().mapValues(lambda vs: [",".join(v) for v in zip(*vs)])
其中,initialgroupByKey
将数据分组到相当于以下内容的结构中:
('id1', [('a','b','c'), ('e','f','g')])
zip(*vs)
将值转换为:
[('a', 'e'), ('b', 'f'), ('c', 'g')]
用join
连接每个元组
reduceByKey
在这里确实不是正确的选择(考虑复杂性),但一般来说,它需要两个参数的函数,所以lambda,b,c:…
是不会做的。我相信你想要这样的东西:
lambda a, b: (a[0] + "," + b[0], a[1] + "," + b[1], a[2] + "," + b[2])
最佳解决方案可以表示为:
a.groupByKey().mapValues(lambda vs: [",".join(v) for v in zip(*vs)])
其中,initialgroupByKey
将数据分组到相当于以下内容的结构中:
('id1', [('a','b','c'), ('e','f','g')])
zip(*vs)
将值转换为:
[('a', 'e'), ('b', 'f'), ('c', 'g')]
用join
连接每个元组
reduceByKey
在这里确实不是正确的选择(考虑复杂性),但一般来说,它需要两个参数的函数,所以lambda,b,c:…
是不会做的。我相信你想要这样的东西:
lambda a, b: (a[0] + "," + b[0], a[1] + "," + b[1], a[2] + "," + b[2])