Performance spark reduceByKey使用scala减少列表时的性能/复杂性

Performance spark reduceByKey使用scala减少列表时的性能/复杂性,performance,scala,apache-spark,rdd,Performance,Scala,Apache Spark,Rdd,我需要对列表执行reduceByKey。什么是最快的解决方案?我正在使用::操作符在reduce操作中合并2个列表,但是::是O(n),所以我担心reduce操作最终会是O(n2) 代码示例: val rdd: RDD[int, List[int]] = getMyRDD() rdd.reduceByKey(_ ::: _) 最佳/最有效的解决方案是什么?您能做的最好的是: rdd.groupByKey.mapValues(_.flatten.toList) 这将: 跳过过时的地图边减少。

我需要对列表执行
reduceByKey
。什么是最快的解决方案?我正在使用
::
操作符在reduce操作中合并2个列表,但是
::
是O(n),所以我担心reduce操作最终会是O(n2)

代码示例:

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

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

您能做的最好的是:

rdd.groupByKey.mapValues(_.flatten.toList)
这将:

  • 跳过过时的地图边减少。它需要稍微大一点的洗牌,但大大减少了GC时间
  • 对中间聚合使用可变缓冲区和摊销常量附加时间
  • 在O(N)时间内压平中间骨料
如果需要地图侧缩小,可以使用
aggregateByKey

import scala.collection.mutable.ArrayBuffer

rdd.aggregateByKey(ArrayBuffer[Int]())(_ ++= _, _ ++= _).mapValues(_.toList)
但通常情况下,与第一种解决方案相比,它的成本要高得多