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/