通过reduceByKey()或其他函数减少Spark中的工作?

时间:2015-09-30 10:37:20

标签: python mapreduce apache-spark reduce pyspark

给出以下列表:

[(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)函数是否可以实现该任务?

1 个答案:

答案 0 :(得分:3)

答案是肯定的:)您可以使用reduceByKeygroupByKey实现相同的效果。事实上,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(_++_)