Spark SQL执行计划能否判断Hive/Iceberg表分区使用情况?
能否通过Spark SQL执行计划判断Hive/Iceberg表的分区使用情况?
针对Hive表
可以通过执行计划判断分区的使用范围:
- 当Spark执行分区裁剪时,
EXPLAIN输出的HiveTableScan节点会包含PushedFilters字段,明确显示被下推到存储层的分区过滤条件。比如SQL仅过滤A=A_VAL时,会看到PushedFilters: [IsNotNull(A), EqualTo(A,A_VAL)],说明仅扫描A分区的对应值,B、C分区未被访问。 - 如果没有任何分区过滤条件,
HiveTableScan会标注扫描全部分区,此时所有分区都会被使用。
针对Iceberg表
Iceberg的执行计划对分区扫描的展示更直观:
EXPLAIN输出的IcebergScan节点会直接列出实际扫描的分区,比如仅用到A分区时会显示partitions: [A=A_VAL],多分区扫描会列出对应的键值组合,全表扫描则标注partitions: all。- 同时节点内的
PartitionFilters字段会明确记录生效的分区过滤规则,能清晰区分哪些分区被选中。
执行计划无法覆盖场景时的替代方法
如果遇到动态分区值(运行时才确定)等执行计划无法展示具体分区的场景,可以通过以下方式获取信息:
- Spark UI SQL详情页:查看
Scan模块,Hive表会显示读取的分区数和总分区数,Iceberg表会直接列出扫描的分区列表,直观对比是否全部分区被使用。 - 底层存储访问日志:查看HDFS、S3等存储的访问日志,通过日志中的文件路径判断哪些分区目录被读取。比如Hive表的分区路径为
A=A_VAL/B=B_VAL/,若日志仅记录A=A_VAL/下的文件访问,说明仅用到A分区。 EXPLAIN EXTENDED命令:比普通EXPLAIN输出更详细,会展示分区裁剪的底层规则、被过滤的分区列表等细节,适合复杂查询场景。- Iceberg专属工具:
- 执行
spark.sql("SELECT * FROM db.table.partitions")列出表的全部分区,结合查询的过滤条件对比实际扫描范围; - 用
spark.sql("DESCRIBE HISTORY db.table")查看表的历史扫描记录,获取过往查询的分区使用情况。
- 执行
- Hive分区对比法:先执行
SHOW PARTITIONS db.table获取全部分区列表,再结合Spark任务日志中记录的读取路径,匹配出被实际访问的分区。
内容的提问来源于stack exchange,提问作者hba
相关产品推荐
相关产品推荐

