首页 > 解决方案 > 使用 groupBy 获取 rdd 列的总和和长度?

问题描述

我有以下RDD:

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

我预期的 RDD 是:

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

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

标签: pythonapache-sparkpysparkrdd

解决方案


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

rdd = sc.parallelize([(1, 300), (4, 60), (4, 20), (2, 2), (2, 3), (2, 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]), (2, [10, 3]), (4, [80, 2])]

推荐阅读