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/