日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hive底层原理 sql执行过程_hive sql编译过程

發布時間:2024/10/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。