Hive SQL语句执行顺序

Hive SQL语句执行顺序,第1张

Hive 中 sql 语句的执行顺序如下:

from .. where .. join .. on .. select .. group by .. select .. having .. distinct .. order by .. limit .. union/union all

下面我们通过一个 sql 语句分析下:

上面这条 sql 语句是可以成功执行的,我们看下它在 MR 中的执行顺序:

Map 阶段

Reduce 阶段

上面这个执行顺序到底对不对呢,我们可以通过 explain 执行计划来看下,内容过多,我们分阶段来看。

我们看到 Stage-5 是根,也就是最先执行 Stage-5,Stage-2 依赖 Stage-5,Stage-0 依赖 Stage-2。

图中标 ① 处是表扫描 *** 作,注意先扫描的 b 表,也就是 left join 后面的表,然后进行过滤 *** 作(图中标 ② 处),我们 sql 语句中是对 a 表进行的过滤,但是 Hive 也会自动对 b 表进行相同的过滤 *** 作,这样可以减少关联的数据量。

先扫描 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 不压缩。

限制最终输出的行数为 10 行。

通过上面对 SQL 执行计划的分析,总结以下几点:

历史上存在的原理,以前都是使用hive来构建数据仓库,所以存在大量对hive所管理的数据查询的需求。而hive、shark、sparlSQL都可以进行hive的数据查询。shark是使用了hive的sql语法解析器和优化器,修改了执行器,使之物理执行过程是跑在spark上;而sparkSQL是使用了自身的语法解析器、优化器和执行器,同时sparkSQL还扩展了接口,不单单支持hive数据的查询,可以进行多种数据源的数据查询。望采纳

依赖第三方组件: Meta store(mysql),hdfs,MapReduce

hive:

Client客户端 CLI、JDBC

Driver连接客户端与服务端的桥梁

SQL Pareser解析器,将SQL转换为抽象语法树AST

1.将HQL语句转换为Token

2.对Token进行解析,生成AST

Physical Plan编译器将AST编译生成逻辑执行计划

Query Optimizer优化器,对逻辑执行计划进行优化

1.将AST转换为QueryBlock

2.将QueryBlock转换为OperatorTree

3.OperatorTree进行逻辑优化

4.生成TaskTree

5.TaskTree执行物理优化

Execution执行器把逻辑执行计划转换成可以运行的物理计划

1.获取MR临时工作目录

3.定义Mapper和Reducer

2.定义Partitioner

4.实例化Job

5.提交Job

1.以Antlr定义的语法规则,对SQL完成词法解析,将SQL转换为AST

2.遍历AST,抽象出查询基本组成单元QueryBlock。

3.遍历QueryBlock,将其转换为OperatorTree,逻辑执行单元

4.利用逻辑优化器对OperatorTree进行逻辑优化。

5.遍历OperatorTree转换为TaskTree,将逻辑执行计划转化为物理执行计划

6.使用物理优化器对TaskTree进行物理优化

7.生成最终的执行计划,提交执行

$HIVE_HOME/bin/hive可以进入客户端

$HIVE_HOME/bin/hive -e "{SQL语句}"可以执行SQL语句

$HIVE_HOME/bin/hive -f {SQL文件名.sql}可以执行sql文件

开启hiveserver2服务,可以通过JDBC提交SQL

创建Driver

创建OptionsProcessor

初始化log4j

标准输入输出以及错误输出流的定义,后续需要输入 SQL 以及打印控制台信息

解析输入的参数,包含"-e -f -v -database"

读取输入的sql

按照""分割的方式解析

解析单行SQL

遇到为"quit"或者"exit"退出

遇到为"source"开头,执行 SQL 文件,读取文件并解析

如果命令以"!"开头,则表示用户需要执行 shell命令

以上三种都不是的情况下执行SQL,进行SQL解析

获取当前系统时间

获取系统结束时间

编译SQL语句

SQL生成AST,构建词法解析器,将关键词替换为TOKEN,进行语法解析,生成最终AST

处理AST,转换为QueryBlock然后转换为OperatorTree,对Operator进行逻辑优化,然后转换为任务树,然后进行物理优化。

根据任务树构建MrJob

添加启动任务,根据是否可以并行来决定是否并行启动Task

设置MR任务的InputFormat、OutputFormat 等等这些 MRJob 的执行类

构建执行MR任务的命令

向yarn提交任务

打印头信息

获取结果集并获取抓取到的条数

打印SQL执行时间及数据条数


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11806538.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存