8HiveSql的原理解析,與mysql差異

2021-10-05 03:43:12 字數 2353 閱讀 8175

hivesql底層預設是基於mr程式執行的,我們分析hivesql的執行原理之前,首先看一下mr程式實現一些sql操作的基本原理。

mr中join的實現原理

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

在map的輸出value中為不同表的資料打上tag標記,在reduce階段根據tag判斷資料**。mapreduce的過程如下:

mr中group by的實現原理

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

將groupby的字段組合為map的輸出key值,利用mapreduce的排序,在reduce階段儲存lastkey區分不同的key。mapreduce的過程如下(當然這裡只是說明reduce端的非hash聚合過程):

mr中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;

實現方式有兩種:

sql轉化為mapreduce的過程

了解了mapreduce實現sql基本操作之後,我們來看看hive是如何將sql轉化為mapreduce任務的,整個編譯過程分為六個階段:

為了詳細說明sql翻譯為mapreduce的過程,這裡以一條簡單的sql為例,sql中包含乙個子查詢,最終將資料寫入到一張表中

from

( select

p.datekey datekey,

p.userid userid,

c.clienttype

from

detail.usersequence_client c

join fact.orderpayment p on p.orderid = c.orderid

join default

.user du on du.userid = p.userid

where p.datekey =

20131118

) base

insert overwrite table `test`.`customer_kpi`

select

base.datekey,

base.clienttype,

count

(distinct base.userid) buyer_count

group by base.datekey, base.clienttype

sql生成ast tree

最終生成的ast tree如下圖右側(使用antlr works生成,antlr works是antlr提供的編寫語法檔案的編輯器),圖中只是展開了骨架的幾個節點,沒有完全展開。

子查詢1/2,分別對應右側第1/2兩個部分。

這裡注意一下內層子查詢也會生成乙個tok_destination節點。請看上面selectstatement的語法規則,這個節點是在語法改寫中特 意增加了的乙個節點。原因是hive中所有查詢的資料均會儲存在hdfs臨時的檔案中,無論是中間的子查詢還是查詢最終的結果,insert語句最終會將 資料寫入表所在的hdfs目錄下。

hive採用了類sql的查詢語言hql(hive query language),他們的操作語言類似,建立表、建立資料庫、基本的增刪改查。

除此之外,基本沒有相同的點了。

除了hql語法相似外,核心、儲存位置、能不能更新、有沒有索引、執行的延遲、擴充套件性方面、資料規模都不一樣。

Tool CRC8 實現基礎與原理解析

1 crc8 標準生成多項式 crc 8 x8 x5 x4 1 0x31 0x131 crc 8 x8 x2 x1 1 0x07 0x107 crc 8 x8 x6 x4 x3 x2 x1 0x5e 0x15e 注 由於多項式的最高為都為 1,並且在 的 crc8 計算中,最高位也是不使用的,所以在...

flask limiter 實踐與原理解析

乙個強大的軟體產品是由許多不同的元件結合完成的,其中在每乙個產品中離不開的就是api系統,api系統在整個產品中居於中樞地位,包括系統內部元件,及客戶對產品的對接都要與api打交道,這就需要最大限度的提高api的處理能力,並且防範無效請求,還有黑客的惡意攻擊。限流可以在nginx層進行設定,當然在a...

Elasticsearch原理解析與效能調優

類似於insert。例如索引乙個文件到乙個索引 倒排索引 預設每個屬性都會有乙個倒排索引,可以設定屬性不被索引,它只能被覆蓋,不能被修改 型別類似表,同一索引的不同型別,可以擁有不同的字段,但應該擁有大部分相似的字段。它可以包含大小寫,不能包含句號,不能以下劃線開頭,長度限制為256.id文件的id...