Spark SQL 中 Group By 子句的底层实现

Pra*_*ant 2 apache-spark apache-spark-sql

Spark SQL中Group By子句的底层实现是什么?据我所知,Spark支持两种类型的Group by操作,即GroupByKey和ReduceByKey。ReduceByKey 是一种映射端缩减,提供比 GroupByKey 更好的性能。

在我们的应用程序代码中,我们在 Spark Dataframes 上使用 Spark SQL,并且不直接创建 RDD。所以,我想到了这个问题:Spark SQL 中的 GroupBy 是否执行 GroupByKey、ReduceByKey 或其他操作。

Dav*_*rba 5

在Spark SQL中,如果调用groupBy(key).agg(...)内部的聚合函数agg,典型的物理计划是HashAggregate -> Exchange -> HashAggregate。第一个HashAggregate负责进行部分聚合(在每个执行器本地),然后Exchange代表洗牌,然后第二个HashAggregate代表洗牌后的最终聚合(最终合并)。

另请注意,有时HashAggregates 可能会被SortAggregates 或ObjectHashAggregates 替换,具体取决于聚合函数和聚合列的数据类型,但模式保持不变(它们成对出现,并且介于Exchange两者之间)。

有时,Exchange如果数据提前重新分区(可能来自分桶或之前的聚合等),则可能会丢失(没有随机播放)。