
# Spark Distinct聚合优化
#### 操作场景
当SQL中存在多个count(distinct)聚合函数，且存在cube，rollup等导致数据膨胀的算子时，使用该特性可以有效减少数据的膨胀倍数，且减少shuffle落盘的数据，从而获得性能提升。开启后，count(distinct)算子的实现，将由原来的expand+多轮聚合，变成普通的count_distinct聚合函数。
#### 约束与限制
- 本章节仅适用于MRS 3.3.1-LTS及之后版本。
- 作业已配置足够的内存。
 
#### 配置参数
1. 安装Spark客户端。 
   详细操作请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
   
   
2. 使用客户端安装用户登录Spark客户端节点。 
   在Spark客户端的"*{客户端安装目录}* /Spark/spark/conf/spark-defaults.conf"配置文件中进行设置，修改如下参数：
   
   | **参数**                                  | **参数说明**                                                                                                                                                                                                                                                                                                                                  | 取值示例  |
   |:---|:---|:---|
   | spark.sql.keep.distinct.expandThreshold | 由cube等引起的数据膨胀多少倍时，触发该优化。需要配置一个大于0的数值来启用。例如1024，代表数据膨胀1024倍及以上时，触发该优化。 如果设置为-1，则不启用该优化。                                                                                                                                                                                                                   | 100   |
   | spark.sql.distinct.aggregator.enabled   | 是否强制开启distinct聚合优化。 - false：关闭强制开启distinct聚合优化。  - true：启用强制开启distinct聚合优化，将不再受限于数据膨胀倍数的约束，直接改写distinct聚合。注意：请在确保有收益的情况下，谨慎使用此选项。   | false |
      
   
   
 
