文章目录
概述
可能所有的SQLboy刚接触SQL语句的时候都是select xxx from xxx where xxx。在hive中,我们把这种语句称为select-from-where型语句,也可称为简单SQL,这类简单SQL是特指不含有变转换函数,聚合函数,开窗函数和连接操作的SQL语句。
这类SQL主要特征是只有map阶段,没有reduce阶段。
本文分析一下这类简单SQL执行计划和性能,让我们从最基础的SQL分析,hive简单语句select from where 型语句性能分析,逐渐深入,进而学会分析复杂SQL的性能和执行计划。
所有的复杂SQL(几百行?上千行?)都是由一个个简单SQL带一些特殊函数堆叠而成的。
1.不带函数操作的select-from-where型简单SQL
这类SQL语句通常只有select-from-where,没有其他函数操作,或者操作符处理,例如字符串截取。
1.1执行示例
例1 不带函数操作的select-from-where型简单SQL。
-- 本文默认使用mr计算引擎
explain
-- 统计年龄等于30岁的所有昵称
select age,nick from temp.user_info_all
where ymd = '20230505'
and age = 30;
执行执行计划结果:
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: user_info_all
Statistics: Num rows: 32634295 Data size: 783223080 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: (age = 30) (type: boolean)
Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: 30 (type: bigint), nick (type: string)
outputColumnNames: _col0, _col1
Statistics: Num rows: 16317147 Data size: 391611528 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: true
Statistics: Num rows: 16317147 Data size: 391611528 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
通过以上内容,我们可以看到,整个SQL逻辑执行过程中只有map操作树(Map Operate Tree),若转换成MapReduce来看的话,即只有Map阶段的任务。
如果有执行计划里关键词不熟悉的,建议阅读这篇 Hive执行计划之一文读懂Hive执行计划 。
1.2 运行逻辑分析
以上流程我们可以分解为运行逻辑图来看,如下图:
我们在之前的文章中提起过,Hive执行计划是一个预估的执行计划,只有在SQL实际执行后才会获取到真正的执行计划。那我们来看看以上语句的实际运行控制台打印过程。额,失算了,因为结果太多,限制一下输出条数。
Query ID = hdfs_20230613111158_03c8f6e1-e04f-4e4e-aa9b-569a89860438
Total jobs = 1