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 stage
Stage-0 depends on stages: Stage-1
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: ads_full_link_report_i_h
Statistics: Num rows: 58083 Data size: 13900518 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: view_dsp (type: bigint)
outputColumnNames: view_dsp
Statistics: Num rows: 58083 Data size: 13900518 Basic stats: COMPLETE Column stats: NONE
Group By Operator
aggregations: sum(view_dsp)
mode: hash
outputColumnNames: _col0
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
Reduce Output Operator
sort order:
Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
value expressions: _col0 (type: bigint)
Reduce Operator Tree:
Group By Operator
aggregations: 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: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE
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
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. 输出解析
输出是一个 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_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
的输出,可以更好地理解查询的权限需求和执行逻辑,从而优化查询性能和权限管理。