scala - groupByKey 与aggregateByKey - 差异究竟来自哪里?

标签 scala apache-spark

groupByKey 的文档中有一些可怕的语言,警告它可能“非常昂贵”,并建议使用 aggregateByKey相反,只要有可能。

我想知道成本的差异是否来自这样一个事实,即对于某些聚合,整个组永远不需要收集并加载到同一节点,或者在实现上是否存在其他差异。

基本上,问题是是否rdd.groupByKey()将等同于 rdd.aggregateByKey(Nil)(_ :+ _, _ ++ _)或者如果它仍然会更贵。

最佳答案

如果您要减少到单个元素而不是列表。

例如:像字数一样,aggregateByKey 的性能更好,因为它不会像链接 performance of group by vs aggregate by 中解释的那样导致随机播放。 .

但在您的情况下,您正在合并到一个列表。在aggregateByKey的情况下,它将首先将分区中键的所有值减少到单个列表,然后将数据发送给shuffle。这将创建与分区一样多的列表,并且内存会很高。

在 groupByKey 的情况下,合并仅发生在负责 key 的一个节点上。创建的列表数量在这里每个键只有一个。
在合并到列表的情况下, groupByKey 在内存方面是最佳的。

另请参阅:SO Answer by zero323

我不确定你的用例。但是,如果您可以限制最终结果中列表中元素的数量,那么与 groupByKey 相比,aggregateByKey/combineByKey 肯定会给出更好的结果。例如:如果您只想为给定的键取前 10 个值。然后你可以通过使用 combineByKey with proper merge and combiner functions 有效地实现这一点。比groupByKey and take 10.

关于scala - groupByKey 与aggregateByKey - 差异究竟来自哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320717/

相关文章:

scala - 记录器log1-Slf4jLogger在超时(5000毫秒)内未响应InitializeLogger(总线)

scala - 在逗号分隔的字符串中获取前 2 个值

java - 通过Java Reflection/Scala Reflection调用实例方法: Which one is faster?

scala - 用函数值覆盖特征方法

hadoop - 如何从 pyspark 连接到 Teradata?

elasticsearch - 如何从 Pyspark 向 Elasticsearch 写入数据?

scala - Spark 通过 SaveMode 写入数据作为 Append 或 overwrite

scala - 覆盖两个 mixin 交集中的特征函数

python - Spark 上的行明智计算

scala - Spark 提供 DataFrame groupBy 中所有列的列表