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