【问题标题】:spark reduceByKey performance/complexity when reducing lists with scala使用 scala 减少列表时的 spark reduceByKey 性能/复杂性
【发布时间】:2017-04-03 23:49:31
【问题描述】:
我需要在列表上执行reduceByKey。最快的解决方案是什么?我使用::: 运算符在reduce 操作中合并2 个列表,但::: 是O(n) 所以我担心reduce 操作最终会是O(n2支持>)。
代码示例:
val rdd: RDD[int, List[int]] = getMyRDD()
rdd.reduceByKey(_ ::: _)
最好/最有效的解决方案是什么?
【问题讨论】:
标签:
performance
scala
apache-spark
rdd
【解决方案1】:
你能做的最好的就是:
rdd.groupByKey.mapValues(_.flatten.toList)
这将:
- 跳过过时的地图端缩减。它需要稍微大一点的 shuffle,但会显着减少 GC 时间。
- 对中间聚合使用具有摊销常量附加时间的可变缓冲区。
- 在 O(N) 时间内压平中间骨料。
如果你想减少地图端,你可以使用aggregateByKey:
import scala.collection.mutable.ArrayBuffer
rdd.aggregateByKey(ArrayBuffer[Int]())(_ ++= _, _ ++= _).mapValues(_.toList)
但与第一个解决方案相比,它通常会贵得多。