[[413648]]
本文转载自微信公众号「五分钟学大数据」,作者园陌 。顺序转载本文请联系五分钟学大数据公众号。正确执行
关于 sql 语句的顺序执行顺序网上有很多资料,但是正确执行大多都没进行验证,并且很多都有点小错误,顺序尤其是正确执行对于 select 和 group by 执行的先后顺序,有说 select 先执行,顺序有说 group by 先执行,正确执行到底它俩谁先执行呢?
今天我们通过 explain 来验证下 sql 的执行顺序。
在验证之前,先说结论,Hive 中 sql 语句的执行顺序如下:
from .. where .. join .. on .. select .. group by .. select .. having .. distinct .. order by .. limit .. union/union all
可以看到 group by 是在两个 select 之间,我们知道 Hive 是默认开启 map 端的 group by 分组的,所以在 map 端是 select 先执行,在 reduce 端是 group by 先执行。
下面我们通过一个 sql 语句分析下:
- select
- sum(b.order_amount) sum_amount,
- count(a.userkey) count_user
- from user_info a
- left join user_order b
- on a.idno=b.idno
- where a.idno > '112233'
- group by a.idno
- having count_user>1
- limit 10;
上面这条 sql 语句是可以成功执行的,我们看下它在 MR 中的执行顺序:
Map 阶段:
Reduce 阶段:
上面这个执行顺序到底对不对呢,我们可以通过 explain 执行计划来看下,内容过多,我们分阶段来看。
首先看下 sql 语句的执行依赖:
我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。
首先执行 Stage-5:
图中标 ① 处是表扫描操作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤操作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤操作,这样可以减少关联的数据量。
接下来执行 Stage-2:
先扫描 a 表(图中标 ① 处);接下来进行过滤操作 idno > '112233'(图中标 ② 处);然后进行 left join,关联的 key 是 idno(图中标 ③ 处);执行完关联操作之后会进行输出操作,输出的是三个字段,包括 select 的两个字段加 group by 的一个字段(图中标 ④ 处);然后进行 group by 操作,分组方式是 hash(图中标 ⑤ 处);然后进行排序操作,按照 idno 进行正向排序(图中标 ⑥ 处)。
首先进行 group by 操作,注意此时的分组方式是 mergepartial 合并分组(图中标 ① 处);然后进行 select 操作,此时输出的字段只有两个了,输出的行数是 30304 行(图中标 ② 处);接下来执行 having 的过滤操作,过滤出 count_user>1 的字段,输出的行数是 10101 行(图中标 ③ 处);然后进行 limit 限制输出的行数(图中标 ④ 处);图中标 ⑤ 处表示是否对文件压缩,false 不压缩。
执行计划中的数据量只是预测的数据量,不是真实运行的,所以数据可能不准!
最后是 Stage-0 阶段:
限制最终输出的行数为 10 行。
通过上面对 SQL 执行计划的分析,总结以下几点:
责任编辑:武晓燕 来源: 五分钟学大数据 SQL顺序Hive
(责任编辑:休闲)
四川省资阳市1—4月新签约项目41个 协议投资额247.86亿元
Waymo和Uber的案子还没结束,Anthony Levandowsk 又惹上了新官司