Hive SQL 执行计划解析
Hive SQL 执行计划解析
一、 explain用法
1. SQL 查询
EXPLAIN SELECT SUM(view_dsp) AS view_sum
FROM ads.table_a
WHERE p_day = '2025-01-06';
2. 执行计划
STAGE DEPENDENCIES:Stage-1 is a root stageStage-0 depends on stages: Stage-1STAGE PLANS:Stage: Stage-1Map ReduceMap Operator Tree:TableScanalias: table_aStatistics: Num rows: 58083 Data size: 13900518 Basic stats: COMPLETE Column stats: NONESelect Operatorexpressions: view_dsp (type: bigint)outputColumnNames: view_dspStatistics: Num rows: 58083 Data size: 13900518 Basic stats: COMPLETE Column stats: NONEGroup By Operatoraggregations: sum(view_dsp)mode: hashoutputColumnNames: _col0Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEReduce Output Operatorsort order:Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEvalue expressions: _col0 (type: bigint)Reduce Operator Tree:Group By Operatoraggregations: sum(VALUE._col0)mode: mergepartialoutputColumnNames: _col0Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEFile Output Operatorcompressed: falseStatistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEtable:input format: org.apache.hadoop.mapred.TextInputFormatoutput format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormatserde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeStage: Stage-0Fetch Operatorlimit: -1Processor Tree:ListSink
3. 执行计划释义
1. STAGE DEPENDENCIES
- Stage-1:根 Stage。
- Stage-0:依赖于 Stage-1,Stage-1 执行完成后执行 Stage-0。
2. STAGE PLANS
Stage: Stage-1
- Map Reduce:MR 执行计划分为两部分。
- Map Operator Tree:MAP 端的执行计划树。
- TableScan:表扫描操作,Map 端第一个操作是加载表。
alias
:表名(table_a
)。Statistics
:表统计信息,包含表中数据条数、数据大小等。
Num rows: 58083
:数据行数。Data size: 13900518
:数据大小。Basic stats: COMPLETE
:基本统计信息完整。Column stats: NONE
:列统计信息未收集。- Select Operator:选取操作。
expressions
:需要的字段名称及字段类型(view_dsp (type: bigint)
)。outputColumnNames
:输出的列名称(view_dsp
)。Statistics
:表统计信息,与 TableScan 相同。- Group By Operator:分组聚合操作。
aggregations
:Map 端聚合函数信息(sum(view_dsp)
)。mode
:聚合模式,值为hash
,表示随机聚合(Hash Partition)。outputColumnNames
:聚合之后输出列名(_col0
)。Statistics
:表统计信息,包含分组聚合之后的数据条数、数据大小等。
Num rows: 1
:聚合后的数据行数。Data size: 8
:聚合后的数据大小。Basic stats: COMPLETE
:基本统计信息完整。Column stats: NONE
:列统计信息未收集。- Reduce Output Operator:Reduce 输出操作。
sort order
:值为空,表示不排序。Statistics
:表统计信息,与 Group By Operator 相同。value expressions
:聚合后的输出字段名称及字段类型(_col0 (type: bigint)
)。- Reduce Operator Tree:Reduce 端的执行计划树。
- Group By Operator:分组聚合操作。
aggregations
:Reduce 端聚合函数信息(sum(VALUE._col0)
)。mode
:全局聚合模式,值为mergepartial
,表示部分合并聚合。outputColumnNames
:全局聚合之后输出列名(_col0
)。Statistics
:表统计信息,包含全局聚合之后的数据条数、数据大小等。
Num rows: 1
:全局聚合后的数据行数。Data size: 8
:全局聚合后的数据大小。Basic stats: COMPLETE
:基本统计信息完整。Column stats: NONE
:列统计信息未收集。- File Output Operator:文件输出操作。
compressed
:是否压缩,值为false
,表示不压缩。Statistics
:表统计信息,与 Group By Operator 相同。table
:输出表的格式信息。
input format
:输入文件格式化方式(org.apache.hadoop.mapred.TextInputFormat
)。output format
:输出文件格式化方式(org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
)。serde
:序列化方式(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
)。Stage: Stage-0
- Fetch Operator:数据提取操作。
limit
:值为-1
,表示不限制条数。- Processor Tree:处理器树。
- ListSink:数据输出到客户端。
二、explain dependency用法
1. SQL 查询
EXPLAIN DEPENDENCY
SELECT COUNT(*)
FROM ads.table_a
WHERE p_day = '2025-01-06';
- 作用:查询表
ads.table_a
中p_day = '2025-01-06'
的数据行数。 EXPLAIN DEPENDENCY
:用于查看查询的依赖信息,包括输入表的分区和表信息。
2. 输出
{"input_partitions": [{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=00"},{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=01"},{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=02"},....},{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=23"}],"input_tables": [{"tabletype": "MANAGED_TABLE","tablename": "ads@table_a"}]
}
3. 解析
输出是一个 JSON 格式的结果,包含两部分:
input_partitions
:查询依赖的分区信息。input_tables
:查询依赖的表信息。
input_partitions
"input_partitions": [{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=00"},{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=01"},...{"partitionName": "ads@table_a@p_day=2025-01-06/p_hour=23"}]
- 含义:查询依赖的分区列表。
- 分区格式:
ads@table_a@p_day=2025-01-06/p_hour=XX
。ads
:数据库名。table_a
:表名。p_day=2025-01-06
:分区键及其值(按天分区)。p_hour=XX
:子分区键及其值(按小时分区,XX
为 00 到 23)。
- 说明:
- 查询涉及
p_day = '2025-01-06'
这一天的所有小时分区(共 24 个分区)。 - 每个分区对应一个小时的子分区(如
p_hour=00
到p_hour=23
)。
- 查询涉及
input_tables
"input_tables": [{"tabletype": "MANAGED_TABLE","tablename": "ads@table_a"}]
- 含义:查询依赖的表信息。
- 字段解析:
tabletype
:表类型,MANAGED_TABLE
表示这是一个 Hive 管理的内部表。tablename
:表名,格式为数据库名@表名
(ads@table_a
)。
通过分析
EXPLAIN DEPENDENCY
的输出,可以更好地理解查询的输入数据来源,从而优化查询性能和资源使用。
三、explain authorization用法
1. SQL 查询
EXPLAIN AUTHORIZATION
SELECT COUNT(*)
FROM ads.table_a
WHERE p_day = '2025-01-06';
- 作用:查询表
ads.table_a
中p_day = '2025-01-06'
的数据行数。 EXPLAIN AUTHORIZATION
:用于查看查询的权限信息,包括输入表、分区、输出路径以及当前用户和操作类型。
2. 输出
INPUTS:ads@table_aads@table_a@p_day=2025-01-06/p_hour=00ads@table_a@p_day=2025-01-06/p_hour=01...ads@table_a@p_day=2025-01-06/p_hour=23
OUTPUTS:hdfs://apple/tmp/hive/ads/37fa21fb-bafb-49b8-a703-f48f1edcade9/hive_2025-01-20_18-50-55_722_2728294902974034323-1/-mr-10000
CURRENT_USER:ads
OPERATION:QUERY
3. 解析
输出分为以下几个部分:
INPUTS
ads@table_a
ads@table_a@p_day=2025-01-06/p_hour=00
ads@table_a@p_day=2025-01-06/p_hour=01
...
ads@table_a@p_day=2025-01-06/p_hour=23
- 含义:查询依赖的输入表和分区。
- 格式:
ads@table_a
:数据库名和表名。ads@table_a@p_day=2025-01-06/p_hour=XX
:分区信息,p_day
是按天分区,p_hour
是按小时分区。
- 说明:
- 查询涉及
ads.table_a
表。 - 查询涉及
p_day = '2025-01-06'
这一天的 24 个小时分区(p_hour=00
到p_hour=23
)。
- 查询涉及
OUTPUTS
hdfs://apple/tmp/hive/ads/37fa21fb-bafb-49b8-a703-f48f1edcade9/hive_2025-01-20_18-50-55_722_2728294902974034323-1/-mr-10000
- 含义:查询结果的输出路径。
- 格式:HDFS 路径,表示查询的临时输出文件。
- 说明:
- 查询结果会被写入这个临时路径。
- 路径中包含时间戳和唯一标识符,用于区分不同的查询任务。
CURRENT_USER
ads
- 含义:当前执行查询的用户。
- 说明:
- 当前用户是
ads
,表示查询是以ads
用户的权限执行的。
- 当前用户是
OPERATION
QUERY
- 含义:当前操作的类型。
- 说明:
- 操作类型是
QUERY
,表示这是一个查询操作。
- 操作类型是
通过分析
EXPLAIN AUTHORIZATION
的输出,可以更好地理解查询的权限需求和执行逻辑,从而优化查询性能和权限管理。