hive sql编译过程

sql查询语句处理步骤流程图sql

准备实例,建立表,插入数据,写要分析的实例查询语句
1.首先建立两个表优化

2.建立两个表,并插入表数据,脚本略
3.编写我们要解析的查询语句,即本篇要查询的实例语句。ui

select top(4)  status , max(m.id) as maxMemberID
from [dbo].[Member] as m right outer join [dbo].[Order] as o 
(on m.id=o.member_id 
where m.id>0)
group by status 
having status>=0
order by maxMemberID asc

实例语句分步骤分析
1.从from开始
1.1 加载左表翻译

from [dbo].[Member] as m

查询结果:member表中的全部数据
1.2 这里应该是 right outer join ,可是这里在sql中被定义分解为2个步骤,即join ,right outer join 。表达式关键字从左到右,依次执行code

join [dbo].[Order] as o

查询结果:存入虚拟表vt1,为两个表的笛卡尔集合。
1.三、on 筛选器排序

on m.id=o.member_id

查询结果以下: 内存

右表(order)做为保留表,把剩余的数据从新添加到上一步的虚拟表vt2中,生成虚拟表vt3。
2. where 阶段ci

where m.id>0

查询结果:存入虚拟表vt4,为筛选的条件为true的结果集,这里加入一个记忆点,就是,where的筛选删除为永久的,而on的筛选删除为暂时的,由于on筛选事后,有可能会通过outer添加外部行,从新把数据加载回来,而where则不能。
3.group by分组it

group by status

查询结果:存入vt5,以status列的数值开始分组,即status列,值同样的分为一组,这里的两个null在三值逻辑中被视为true。三值逻辑:true,false,null。此三值,null为未知,是数据的逻辑特点,有的地方两个null相等为ture,在有些地方则为false。这个你百度下看看有不少讲解。
4.having 筛选编译

having status>=0

查询结果:筛选分好组的组数据,把不知足条件的删除掉
5.select 查询挑拣计算列
5.一、计算表达式

select status , max(m.id)

5.二、distinct过滤重复 
5.三、top 结合order by 筛选 多少行,但这里的数据没有排序只是把多少行数据列出来而已。
6.order by
排序显示

Join的实现原理

select u.name, o.orderid from order o join user u on o.uid = u.uid;

在map的输出value中为不一样表的数据打上tag标记,在reduce阶段根据tag判断数据来源。MapReduce的过程以下(这里只是说明最基本的Join的实现,还有其余的实现方式)

Group By的实现原理

select rank, isonline, count(*) from city group by rank, isonline;

将GroupBy的字段组合为map的输出key值,利用MapReduce的排序,在reduce阶段保存LastKey区分不一样的key。MapReduce的过程以下(固然这里只是说明Reduce端的非Hash聚合过程)

Distinct的实现原理

select dealid, count(distinct uid) num from order group by dealid;

当只有一个distinct字段时,若是不考虑Map阶段的Hash GroupBy,只须要将GroupBy字段和Distinct字段组合为map输出key,利用mapreduce的排序,同时将GroupBy字段做为reduce的key,在reduce阶段保存LastKey便可完成去重

若是有多个distinct字段呢,以下面的SQL

select dealid, count(distinct uid), count(distinct date) from order group by dealid;

实现方式有两种:
(1)若是仍然按照上面一个distinct字段的方法,即下图这种实现方式,没法跟据uid和date分别排序,也就没法经过LastKey去重,仍然须要在reduce阶段在内存中经过Hash去重

(2)第二种实现方式,能够对全部的distinct字段编号,每行数据生成n行数据,那么相同字段就会分别排序,这时只须要在reduce阶段记录LastKey便可去重。
这种实现方式很好的利用了MapReduce的排序,节省了reduce阶段去重的内存消耗,可是缺点是增长了shuffle的数据量。
须要注意的是,在生成reduce value时,除第一个distinct字段所在行须要保留value值,其他distinct数据行value字段都可为空。

SQL转化为MapReduce的过程
了解了MapReduce实现SQL基本操做以后,咱们来看看Hive是如何将SQL转化为MapReduce任务的,整个编译过程分为六个阶段:

Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree 遍历AST Tree,抽象出查询的基本组成单元QueryBlock 遍历QueryBlock,翻译为执行操做树OperatorTree 逻辑层优化器进行OperatorTree变换,合并没必要要的ReduceSinkOperator,减小shuffle数据量 遍历OperatorTree,翻译为MapReduce任务 物理层优化器进行MapReduce任务的变换,生成最终的执行计划

相关文章
相关标签/搜索