Spark SQL中的聚合(Aggregate)实现
Sort Based Aggregate
首先来说说实现比较简单(但实际执行起来却不简单)的Sort Based Aggregate。顾名思义,这是一种基于排序的聚合实现,在进行聚合之前,会根据grouping key进行分区以及分区内排序,将具有相同grouping key的记录都分布在同一个partition内且前后相邻,聚合时只需要顺序遍历整个分区内的数据,即可以得到聚合结果。
如图:
途中可以看出清晰的执行流程,包括重分区和分区内排序,最后遍历每个分区,对每个key region做一个聚合,得到最终结果。
Hash Based Aggregation
即基于Hash Map的聚合实现,一般情况下使用java的HashMap进行聚合即可,但java的内置类在使用上存在着冗余信息多、占用空间大、受GC影响的问题。故SparkSQL中实现了自己的一套HashMap,裁减掉不必要的功能,使空间利用更加充分,内存申请/释放也更有效率。