【问题标题】: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)
    

    但与第一个解决方案相比,它通常会贵得多。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2021-08-14
      • 2022-01-17
      • 2021-08-15
      • 2016-02-27
      • 2023-03-11
      • 2016-08-26
      • 2017-04-10
      • 2013-06-04
      相关资源
      最近更新 更多