减少对-python
如果必须对一对值进行缩减,那么如何为同一对值编写lambda表达式减少对-python,python,mapreduce,apache-spark,pyspark,Python,Mapreduce,Apache Spark,Pyspark,如果必须对一对值进行缩减,那么如何为同一对值编写lambda表达式 testr = [('r1', (1, 1)), ('r1', (1, 5)),('r2', (1, 1)),('r3', (1, 1))] 期望输出为 ('r1', (2, 6)),('r2', (1, 1)),('r3', (1, 1)) 按键减少它: .reduceByKey(lambda a, b: (a[0]+b[0], a[1]+b[1])) 您可以使用zip使任意长度的元组更通用: .reduceByKey
testr = [('r1', (1, 1)), ('r1', (1, 5)),('r2', (1, 1)),('r3', (1, 1))]
期望输出为
('r1', (2, 6)),('r2', (1, 1)),('r3', (1, 1))
按键减少它:
.reduceByKey(lambda a, b: (a[0]+b[0], a[1]+b[1]))
您可以使用zip使任意长度的元组更通用:
.reduceByKey(lambda a, b: tuple(x+y for x,y in zip(a,b)))
您可以使用combineByKey方法
testr = sc.parallelize((('r1', (1, 1)), ('r1', (1, 5)),('r2', (1, 1)),('r3', (1, 1))))
testr.combineByKey(lambda x:x,lambda x,y:(x[0]+y[0],x[1]+y[1]),lambda x,y:(x[0]+x[1],y[0]+y[1])).collect()
我试试这个。我使用字符串作为键,并且值对始终包含整数值。如果数据显示值对中存在混合,则可以消除
int()
调用(如果它们都是int)。
testr = sc.parallelize((('r1', (1, 1)), ('r1', (1, 5)),('r2', (1, 1)),('r3', (1, 1))))
testr.combineByKey(lambda x:x,lambda x,y:(x[0]+y[0],x[1]+y[1]),lambda x,y:(x[0]+x[1],y[0]+y[1])).collect()