Apache spark Pyspark:对rdd的值应用reduce by key
经过一些转换后,我得到了一个rdd,格式如下:Apache spark Pyspark:对rdd的值应用reduce by key,apache-spark,pyspark,rdd,reduce,Apache Spark,Pyspark,Rdd,Reduce,经过一些转换后,我得到了一个rdd,格式如下: [(0,[('a',1),('b',1),('b',1),('b',1)]) (1,[('c',1),('d',1),('h',1),('h',1)])] 我不知道如何本质上“reduceByKey()”这个rdd的值部分 这就是我想要实现的目标: [(0,[('a',1),('b',3)]) (1,[('c',1),('d',1),('h',2)]) 我最初使用的是.values(),然后将reduceByKey应用于结果,但最终我丢失了原始
[(0,[('a',1),('b',1),('b',1),('b',1)])
(1,[('c',1),('d',1),('h',1),('h',1)])]
我不知道如何本质上“reduceByKey()”这个rdd的值部分
这就是我想要实现的目标:
[(0,[('a',1),('b',3)])
(1,[('c',1),('d',1),('h',2)])
我最初使用的是.values(),然后将reduceByKey应用于结果,但最终我丢失了原始密钥(在本例中为0或1)。您丢失了原始密钥,因为
.values()
将只获取一行键值的值。您应该对行中的元组求和
从集合导入defaultdict
def sum_行(行):
结果=defaultdict(int)
对于键,第[1]行中的val:
结果[键]+=val
返回(行[0],列表(result.items())
data_rdd=data_rdd.map(总和行)
打印(数据收集())
#[(0,[('a',1),('b',3)],(1,[('h',2),('c',1),('d',1)]]
虽然值
给出了RDD,reduceByKey
对RDD上的所有值都有效,而不是按行
您还可以使用groupby
(需要订购)来实现相同的功能:
from itertools import groupby
distdata.map(lambda x: (x[0], [(a, sum(c[1] for c in b)) for a,b in groupby(sorted(x[1]), key=lambda p: p[0]) ])).collect()