显示抽象语法树
```sql
EXPLAIN SELECT * from dby_pro.test1;
```
## explain
该命令可以返回hive的查询执行计划。不需要执行查询。
查询计划包含三个部分,
1.AST
Abstract syntax tree (AST).抽象语法树。通过ANTLR类库生成。
2.Stage dependencies:
阶段依赖。
用来执行查询的依赖列表。
3.Stage plans
阶段计划。
## 实例
在 hive cli 中输入以下命令(hive 2.3.7):
```
explain select sum(id) from test1;
```
得到结果
```
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: test1
Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: id (type: int)
outputColumnNames: id
Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE
Group By Operator
aggregations: sum(id)
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.SequenceFileInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: -1
Processor Tree:
ListSink
```
我们将上述结果拆分看,先从最外层开始,包含两个大的部分:
**stage dependencies**: 各个stage之间的依赖性
**stage plan**: 各个stage的执行计划
先看第一部分 stage dependencies ,包含两个 stage,Stage-1 是根stage,说明这是开始的stage,Stage-0 依赖 Stage-1,Stage-1执行完成后执行Stage-0。
再看第二部分 stage plan,里面有一个 Map Reduce,一个MR的执行计划分为两个部分:
**Map Operator Tree**: MAP端的执行计划树
**Reduce Operator Tree**: Reduce端的执行计划树
这两个执行计划树里面包含这条sql语句的 operator:
map端第一个操作肯定是加载表,所以就是 TableScan 表扫描操作,常见的属性:
**alias**: 表名称
**Statistics**: 表统计信息,包含表中数据条数,数据大小等
**Select Operator**: 选取操作,常见的属性 :
**expressions**:需要的字段名称及字段类型
**outputColumnNames**:输出的列名称
**Statistics**:表统计信息,包含表中数据条数,数据大小等
**Group By Operator**:分组聚合操作,常见的属性:
**aggregations**:显示聚合函数信息
**mode**:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
**keys**:分组的字段,如果没有分组,则没有此字段
**outputColumnNames**:聚合之后输出列名
**Statistics**: 表统计信息,包含分组聚合之后的数据条数,数据大小等
**Reduce Output Operator**:输出到reduce操作,常见属性:
**sort order**:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 +- 排序的列为两列,第一列为正序,第二列为倒序
**Filter Operator**:过滤操作,常见的属性:
**predicate**:过滤条件,如sql语句中的where id>=1,则此处显示(id >= 1)
**Map Join Operator**:join 操作,常见的属性:
**condition map**:join方式 ,如Inner Join 0 to 1 Left Outer Join0 to 2
**keys**: join 的条件字段
**outputColumnNames**: join 完成之后输出的字段
**Statistics**: join 完成之后生成的数据条数,大小等
**File Output Operator**:文件输出操作,常见的属性
**compressed**:是否压缩
**table**:表的信息,包含输入输出文件格式化方式,序列化方式等
**Fetch Operator** 客户端获取数据操作,常见的属性:
**limit**,值为 -1 表示不限制条数,其他值为限制的条数
```
## ANALYZE
分析表数据。用于执行计划选择的参考。
先执行分析命令,再通过DESCRIBE查看统计的结果。
//统计表
ANALYZE TABLE employee COMPUTE STATISTICS;
//统计分区
$hive>ANALYZE TABLE employee_partitioned PARTITION(year=2014, month=12) COMPUTE STATISTICS;
//查看表的概况
$hive>desc employee ;
$hive>desc formatted employee ;
$hive>desc extended employee ;