合并CBO优化
操作场景
Spark SQL默认支持基于规则的优化,但仅仅基于规则优化不能保证Spark选择更优的查询计划。CBO(Cost-Bsed Optimizer)是一种为SQL智能选择查询计划的技术。通过配置开启CBO后,CBO优化器可以基于表和列的统计信息,进行一系列的估算,最终选择出更优的查询计划。
操作步骤
要使用CBO优化,可以按照以下步骤进行优化。
- 需要先执行特定的SQL语句来收集所需的表和列的统计信息。
- 生成表级别统计信息(扫表):
ANALYZE TABLE src COMPUTE STATISTICS
生成sizeInBytes和rowCount。
使用ANALYZE语句收集统计信息时,无法计算非HDFS数据源的表的文件大小。
- 生成表级别统计信息(不扫表):
ANALYZE TABLE src COMPUTE STATISTICS NOSCAN
只生成sizeInBytes,如果原来已经生成过sizeInBytes和rowCount,而本次生成的sizeInBytes和原来的大小一样,则保留rowCount(若存在),否则清除rowCount。
- 生成列级别统计信息
ANALYZE TABLE src COMPUTE STATISTICS FOR COLUMNS a, b, c
生成列统计信息,为保证一致性,会同步更新表统计信息。目前不支持复杂数据类型(如Seq, Map等)和HiveStringType的统计信息生成。
- 显示统计信息
在Statistics中会显示“xxx bytes, xxx rows”分别表示表级别的统计信息。也可以通过如下命令显示列统计信息:
DESC FORMATTED src a
使用限制:当前统计信息收集不支持针对分区表的分区级别的统计信息。
- 生成表级别统计信息(扫表):
- 在Spark客户端的“spark-defaults.conf”配置文件中进行表1设置。
表1 参数介绍 参数
描述
默认值
spark.sql.cbo.enabled
CBO总开关。
- true表示打开,
- false表示关闭。
要使用该功能,需确保相关表和列的统计信息已经生成。
false
spark.sql.cbo.joinReorder.enabled
使用CBO来自动调整连续的inner join的顺序。
- true:表示打开
- false:表示关闭
要使用该功能,需确保相关表和列的统计信息已经生成,且CBO总开关打开。
false
spark.sql.cbo.joinReorder.dp.threshold
使用CBO来自动调整连续inner join的表的个数阈值。
如果超出该阈值,则不会调整join顺序。
12