给出以下列表:
[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]
我需要为每个键输出列表值的第一个元素列表(例如,键135, 2409, 12846
的{{1}}和键0
的{{1}})列表值的第二个元素(即13840
的{{1}}和1
的{{1}})大于或等于某个值(假设为2)。例如,在这种特殊情况下,输出应为:
2, 1, 2
元组0
被丢弃,因为2
。
我通过应用1
,[(0, [135, 12846]), (1, [13840]), ...]
和最终(0, [2409, 1])
函数实现了这一目标,但显然1 < 2
的效率低于reduce函数。
仅使用groupByKey()
或mapValues(list)
函数是否可以实现该任务?
答案 0 :(得分:3)
答案是肯定的:)您可以使用reduceByKey
和groupByKey
实现相同的效果。事实上,reduceByKey
应始终受到青睐,因为它会在重排数据之前执行地图侧缩减。
使用reduceByKey
的解决方案(在Scala中,但我确定您明白了,如果您愿意,可以轻松将其转换为Python):
val rdd = sc.parallelize(List((0, List(135, 2)), (0, List(2409, 1)), (0, List(12846, 2)), (1, List(13840, 2))))
rdd.mapValues(v => if(v(1) >= 2) List(v(0)) else List.empty)
.reduceByKey(_++_)