给出以下列表:
[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]
如果列表值的第二个元素是每个键,我需要输出列表值的第一个元素的列表(即, 135, 2409, 12846
对于键 0
和 13840
对于键 1
) (即, 2, 1, 2
代表 0
, 2
代表 1
)大于或等于某个值(假设为 2)。例如,在这种特殊情况下,输出应该是:
[(0, [135, 12846]), (1, [13840]), ...]
元组(0, [2409, 1])
被丢弃,因为 1 < 2
.
我通过应用 groupByKey()
实现了这一点,一个mapValues(list)
最后一个map
功能,但很清楚groupByKey()
效率低于reduce函数。
仅使用 reduceByKey()
是否可以实现该任务?或combineByKey()
功能?
最佳答案
答案是肯定的:) 您可以使用 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(_++_)
关于python - Spark中通过reduceByKey()或其他函数来减少作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32863963/