2016-11-20 64 views
1

我需要在列表上执行reduceByKey。什么是最快的解决方案?我正在使用:::运算符合并2列表中的减少操作,但:::是O(n),因此恐怕减少操作将最终成为O(n )spark减少使用scala减少列表时的性能/复杂性

代码示例:

val rdd: RDD[int, List[int]] = getMyRDD() 
rdd.reduceByKey(_ ::: _) 

什么是最好/最有效的解决方案?

回答

2

你能做的最好的是:

rdd.groupByKey.mapValues(_.flatten.toList) 

这将:

  • 跳过过时的地图,一边减少。它需要稍微大一点的洗牌,但会大大缩短GC时间。
  • 对于中间聚合,使用可变缓冲区,具有分摊的常量附加时间。
  • 平展中间集合在O(N)时间。

如果你想映射,边减速可以使用aggregateByKey

import scala.collection.mutable.ArrayBuffer 

rdd.aggregateByKey(ArrayBuffer[Int]())(_ ++= _, _ ++= _).mapValues(_.toList) 

,但通常会比第一个解决方案是显著更昂贵。