Spark 中的 Window 与 GroupBy 性能

Posted

技术标签:

【中文标题】Spark 中的 Window 与 GroupBy 性能【英文标题】:Window Vs GroupBy Performance in Spark 【发布时间】:2019-09-09 09:53:40 【问题描述】:

我是 spark 的新手,我观察到在某些情况下,窗口函数方法和 groupBy 方法可以相互替代。在这里,我想从性能的角度了解哪个更好,为什么?这两种方法都会导致数据重新洗牌,但在哪些情况下一种会比另一种更有效?

【问题讨论】:

【参考方案1】:

据我了解,groupBy 性能更高,因为它使用部分聚合。所以使用groupBy,并不是所有的记录都被打乱,而只有部分聚合器(例如avg,那就是总和和计数)。

另一方面,window-function 总是会打乱你的记录,聚合是在之后完成的,因此应该会更慢。

但实际上没有groupBy 与窗口函数的选择,因为在大多数情况下,您需要将groupBy 结果与原始数据的连接结合起来(除非您可以使用广播连接,否则可能会很昂贵) ,而且更多时候您无法使用groupBy 实现逻辑(运行总和/平均值、领先/滞后等)。

但不幸的是,关于此类主题的(官方)文献很少......

【讨论】:

我读到如果 groupBy 后面有一个 join,那么 spark 会尝试以最佳方式对数据进行洗牌。 umbertogriffo.gitbooks.io/… 我的意思是,它会以这样一种方式对数据进行洗牌,即在 grouby 和 join 操作之间进行最小洗牌,但对此没有太多了解。 @Hitesh 但此文档与 RDD 有关,可能与 Dataset/Dataframe 不同

以上是关于Spark 中的 Window 与 GroupBy 性能的主要内容,如果未能解决你的问题,请参考以下文章

Spark Window 聚合与 Group By/Join 性能

spark sql DataFrame 的 groupBy+agg 与 groupByKey+mapGroups

spark sql DataFrame 的 groupBy+agg 与 groupByKey+mapGroups

Spark 中的 GroupByKey 函数有那么糟糕吗? [复制]

在 spark 数据框中的几列上替代 groupBy

使用聚合 spark 和 scala 选择