通过 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, 12846
键 0
和 13840
键 1
)如果列表值的第二个元素(即 0
的 2, 1, 2
和 1
的 2
)大于或等于某个值(假设 2 ).例如,在这种特殊情况下,输出应该是:
[(0, [135, 12846]), (1, [13840]), ...]
元组 (0, [2409, 1])
被丢弃,因为 1 < 2
.
我通过应用 groupByKey()
、mapValues(list)
和最终的 map
函数实现了这一点,但显然 groupByKey()
的效率低于 reduce 函数。
仅使用 reduceByKey()
或 combineByKey()
函数是否可以完成该任务?
答案是肯定的 :) 您可以使用 reduceByKey
和 groupByKey
实现相同的效果。事实上,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(_++_)
给定以下列表:
[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]
我需要为每个输出列表值的第一个元素的列表(即,135, 2409, 12846
键 0
和 13840
键 1
)如果列表值的第二个元素(即 0
的 2, 1, 2
和 1
的 2
)大于或等于某个值(假设 2 ).例如,在这种特殊情况下,输出应该是:
[(0, [135, 12846]), (1, [13840]), ...]
元组 (0, [2409, 1])
被丢弃,因为 1 < 2
.
我通过应用 groupByKey()
、mapValues(list)
和最终的 map
函数实现了这一点,但显然 groupByKey()
的效率低于 reduce 函数。
仅使用 reduceByKey()
或 combineByKey()
函数是否可以完成该任务?
答案是肯定的 :) 您可以使用 reduceByKey
和 groupByKey
实现相同的效果。事实上,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(_++_)