通过reduceByKey()或其他函数在Spark中Reduce job



给定以下列表:

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

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

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

相关内容

  • 没有找到相关文章

最新更新