Hive面試題3 底層知識

2021-10-18 16:47:29 字數 2111 閱讀 8058

目錄

1.hive架構

什麼是hive

hive架構

hive優點

hive使用場景

hive的執行流程

2.sql如何轉為mapreduce程式的

2)元資料:metastore

3)hadoop

4)驅動器:driver

(1)解析器(sql parser):將sql字串轉換成抽象語法樹ast,這一步一般都用第三方工具庫完成,比如antlr;對ast進行語法分析,比如表是否存在、字段是否存在、sql語義是否有誤。

(2)編譯器(physical plan):將ast編譯生成邏輯執行計畫。

(3)優化器(query optimizer):對邏輯執行計畫進行優化。

(4)執行器(execution):把邏輯執行計畫轉換成可以執行的物理計畫。對於hive來說,就是mr/spark。

mapreduce實現基本sql操作的原理

詳細講解sql編譯為mapreduce之前,我們先來看看mapreduce框架實現sql基本操作的原理

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任務的,整個編譯過程分為六個階段:

**: 

Hive 底層與架構相關面試題解析

hive 是大資料工程師的必備技能,它幫助我們解決了海量資料查詢的問題,但是它保證穩定性的同時也遺留下了查詢慢的問題。雖然缺點很明顯,但是那麼多年過去了,大資料生態圈仍然有它的一席之地,因為穩定性這個明顯的優點,大家到現在為止還是喜歡用 hive 來跑 t 1 的離線任務。另外,大家都喜歡把常寫 h...

Hive面試題三

2014010114 2014010216 2014010317 2014010410 2014010506 2012010609 2012010732 2012010812 2012010919 2012011023 2001010116 2001010212 2001010310 2001010...

Hive日期查詢面試題

題目源自一次hive筆試,純手工錄入 欄位名詞 字段型別 中文描述 說明wrcvdate int日期 主鍵year int年 month int月 dayint 日flag int工作日標記 1表示工作日,0表示非工作日 要求編寫sql語句查詢20061231對應的上一工作日日期 我的解答 sele...