使用groupBy获取rdd列的总和和长度?

问题描述

我有以下 RDD:

[(1,300),(4,60),20),(2,2),3),5)]

我预期的 RDD 是:

[(1,[300,1]),[10,3]),[80,2])]

元组中列表中的第一个值是总和(例如,对于 2:其 2+3+5 = 10),第二个值是编号。出现次数(例如 1 出现一次)。使用 groupBy 函数可以实现预期的 RDD 吗?

解决方法

您可以将每个值映射到列表 [x,1],然后对每个键的所有列表求和。

rdd = sc.parallelize([(1,300),(4,60),20),(2,2),3),5)])

result = rdd.mapValues(lambda x: [x,1]).reduceByKey(lambda x,y: [x[0] + y[0],x[1] + y[1]])

result.collect()
# [(1,[300,1]),[10,3]),[80,2])]