通过 reduceByKey() 或其他功能减少 Spark 中的作业?

Reduce job in Spark by reduceByKey() or other functions?

给定以下列表:

[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]

我需要为每个输出列表值的第一个元素的列表(即,135, 2409, 128460138401)如果列表值的第二个元素(即 02, 1, 212)大于或等于某个值(假设 2 ).例如,在这种特殊情况下,输出应该是:

[(0, [135, 12846]), (1, [13840]), ...]

元组 (0, [2409, 1]) 被丢弃,因为 1 < 2.

我通过应用 groupByKey()mapValues(list) 和最终的 map 函数实现了这一点,但显然 groupByKey() 的效率低于 reduce 函数。

仅使用 reduceByKey()combineByKey() 函数是否可以完成该任务?

答案是肯定的 :) 您可以使用 reduceByKeygroupByKey 实现相同的效果。事实上,reduceByKey 应该总是受到青睐,因为它在洗牌数据之前执行 map side reduce。

使用 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(_++_)