gpt4 book ai didi

apache-spark - groupByKey 是否比 reduceByKey 更受欢迎

转载 作者:行者123 更新时间:2023-12-03 21:22:20 26 4
gpt4 key购买 nike

我总是用reduceByKey当我需要在 RDD 中对数据进行分组时,因为它会在对数据进行混洗之前执行 map 侧缩减,这通常意味着更少的数据会被混洗,从而获得更好的性能。即使map端reduce函数收集所有值并没有实际减少数据量,我仍然使用reduceByKey , 因为我假设 reduceByKey 的性能永远不会比 groupByKey 更糟.但是,我想知道这个假设是否正确,或者是否确实存在 groupByKey 的情况。应该首选??

最佳答案

我相信 climbage 忽略了问题的其他方面和 eliasah :

  • 代码可读性
  • 代码可维护性
  • 代码库大小

  • 如果操作不减少数据量,它必须是一种或另一种语义等价于 GroupByKey .假设我们有 RDD[(Int,String)] :

    import scala.util.Random
    Random.setSeed(1)

    def randomString = Random.alphanumeric.take(Random.nextInt(10)).mkString("")

    val rdd = sc.parallelize((1 to 20).map(_ => (Random.nextInt(5), randomString)))

    我们想要连接给定键的所有字符串。与 groupByKey这很简单:

    rdd.groupByKey.mapValues(_.mkString(""))

    使用 reduceByKey 的简单解决方案看起来像这样:

    rdd.reduceByKey(_ + _)

    它很短,可以说很容易理解,但存在两个问题:
  • 效率极低,因为它创建了一个新的 String每次对象*
  • 表明您执行的操作比实际操作更便宜,特别是如果您只分析 DAG 或调试字符串

  • 为了处理第一个问题,我们需要一个可变数据结构:

    import scala.collection.mutable.StringBuilder

    rdd.combineByKey[StringBuilder](
    (s: String) => new StringBuilder(s),
    (sb: StringBuilder, s: String) => sb ++= s,
    (sb1: StringBuilder, sb2: StringBuilder) => sb1.append(sb2)
    ).mapValues(_.toString)

    它仍然暗示了其他正在发生的事情并且非常冗长,特别是如果在您的脚本中重复多次。你当然可以提取匿名函数

    val createStringCombiner = (s: String) => new StringBuilder(s)
    val mergeStringValue = (sb: StringBuilder, s: String) => sb ++= s
    val mergeStringCombiners = (sb1: StringBuilder, sb2: StringBuilder) =>
    sb1.append(sb2)

    rdd.combineByKey(createStringCombiner, mergeStringValue, mergeStringCombiners)

    但归根结底,这仍然意味着要付出额外的努力来理解这段代码,增加复杂性并且没有真正的附加值。我发现特别令人不安的一件事是明确包含可变数据结构。即使 Spark 处理了几乎所有的复杂性,这也意味着我们不再拥有优雅、引用透明的代码。

    我的观点是,如果您真的想尽一切办法减少数据量,请使用 reduceByKey .否则,您会使您的代码更难编写,更难分析并且一无所获。

    备注 :

    这个答案集中在 Scala RDD API。当前的 Python 实现与其对应的 JVM 完全不同,并且包含的​​优化比简单的 reduceByKey 具有显着优势。在 groupBy 的情况下实现类操作。

    对于 Dataset API 见 DataFrame / Dataset groupBy behaviour/optimization .

    * 见 Spark performance for Scala vs Python举一个令人信服的例子

    关于apache-spark - groupByKey 是否比 reduceByKey 更受欢迎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33221713/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com