hive底层原理 sql执行过程_hive sql编译过程
sql查詢語句處理步驟流程圖
準備實例,創建表,插入數據,寫要分析的實例查詢語句
1.首先創建兩個表
2.創建兩個表,并插入表數據,腳本略
3.編寫咱們要解析的查詢語句,即本篇要查詢的實例語句。
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 。表達式關鍵字從左到右,依次執行
join [dbo].[Order] as o
查詢結果:存入虛擬表vt1,為兩個表的笛卡爾集合。
1.3、on 篩選器
on m.id=o.member_id
查詢結果如下:
右表(order)作為保留表,把剩余的數據重新添加到上一步的虛擬表vt2中,生成虛擬表vt3。
2. where 階段
where m.id>0
查詢結果:存入虛擬表vt4,為篩選的條件為true的結果集,這里加入一個記憶點,就是,where的篩選刪除為永久的,而on的篩選刪除為暫時的,因為on篩選過后,有可能會經過outer添加外部行,重新把數據加載回來,而where則不能。
3.group by分組
group by status
查詢結果:存入vt5,以status列的數值開始分組,即status列,值一樣的分為一組,這里的兩個null在三值邏輯中被視為true。三值邏輯:true,false,null。此三值,null為未知,是數據的邏輯特色,有的地方兩個null相等為ture,在有些地方則為false。這個你百度下看看有很多講解。
4.having 篩選
having status>=0
查詢結果:篩選分好組的組數據,把不滿足條件的刪除掉
5.select 查詢挑揀計算列
5.1、計算表達式
select status , max(m.id)
5.2、distinct過濾重復
5.3、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任務的變換,生成最終的執行計劃
總結
以上是生活随笔為你收集整理的hive底层原理 sql执行过程_hive sql编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浮雕大理石台面取名怎么取?
- 下一篇: 浏河民用电费多少钱一度?