Hive面試總結

2021-10-01 11:14:07 字數 1658 閱讀 1655

一:order by

order by會對輸入做全域性排序,因此只有乙個reducer(多個reducer無法保證全域性有序),然而只有乙個reducer,會導致當輸入規模較大時,消耗較長的計算時間。

set hive.mapred.mode預設為nonstrict,在strict模式下使用order by必須執行limit,否則報錯

二:sort by

sort by不是全域性排序,其在資料進入reducer前完成排序,因此,如果用sort by進行排序,並且設定mapred.reduce.tasks>1,(mapred.reduce.tasks=1效果和orderby 是一樣的)則sort by只會保證每個reducer的輸出有序,並不保證全域性有序。

sort by不同於order by,它不受hive.mapred.mode屬性的影響,sort by的資料只能保證在同乙個reduce中的資料可以按指定字段排序。使用sort by你可以指定執行的reduce個數(通過set mapred.reduce.tasks=n來指定),對輸出的資料再執行歸併排序,即可得到全部結果。

三:distribute by

distribute by是控制在map端如何拆分資料給reduce端的。hive會根據distribute by後面列,對應reduce的個數進行分發,預設是採用hash演算法。通常和sort by搭配使用,sort by為每個reduce產生乙個排序檔案。在有些情況下,你需要控制某個特定行應該到哪個reducer,這通常是為了進行後續的聚集操作。distribute by剛好可以做這件事。

因此,distribute by經常和sort by配合使用。比如對同一年份中的溫度進行排序:distribute by year sort by temperature,distribute by保證了同一reducer中接受到的是同一年份的資料,而sort by是對reducer排序

注:distribute by和sort by的使用場景

1.map輸出的檔案大小不均。

2.reduce輸出檔案大小不均。

3.小檔案過多。

4.檔案超大。

四:cluster by

當distribute by和sorts by的字段相同時,可以使用cluster by方式,cluster by除了具有distribute by的功能外還兼具sort by的功能。但是排序只能是公升序(asc)排序,不能指定排序規則為asc或者desc。
1)使用者提交查詢等任務給driver

2) 編譯器獲得該使用者的任務plan

3) 編譯器compiler根據使用者任務去metastore中獲取需要的hive的元資料資訊。

4.)編譯器compiler得到元資料資訊,對任務進行編譯,先將hiveql轉換為抽象語法樹,然後將抽象語法樹轉換成查詢塊,將查詢塊轉化為邏輯的查詢計畫,重寫邏輯查詢計畫,將邏輯計畫轉化為物理的計畫(mapreduce), 最後選擇最佳的策略。

5)將最終的計畫提交給driver。

6) driver將計畫plan轉交給executionengine去執行,獲取元資料資訊,提交給nodemanager執行該任務,任務會直接讀取hdfs中檔案進行相應的操作。

7) 獲取執行的結果。

8) 取得並返回執行結果。

參考

Hive面試題思路總結(一)

幾個hive面試題,總是寫不上來,看過兩遍還是不會,還是寫不出來,進一步說明了,寫 真的需要很瘋狂的寫才可能比較熟悉。不過好在,現在基本都有思路了,簡單總結一下。這種題有了思路,把它形成套路,自然就熟能生巧了,但是光看懂思路真的寫還是各種錯誤,所以說寫出來才能真的信自己會了。第一題根據以下資料,求單...

Hive總結(五)hive日誌

日誌記錄了程式執行的過程,是一種查詢問題的利器。hive中的日誌分為兩種 1.系統日誌,記錄了hive的運 況,錯誤狀況。2.job 日誌,記錄了hive 中job的執行的歷史過程。系統日誌儲存在什麼地方呢 在hive conf hive log4j.properties 檔案中記錄了hive日誌的...

Hive總結(五)hive日誌

日誌記錄了程式執行的過程,是一種查詢問題的利器。hive中的日誌分為兩種 1.系統日誌,記錄了hive的運 況,錯誤狀況。2.job 日誌,記錄了hive 中job的執行的歷史過程。系統日誌儲存在什麼地方呢 在hive conf hive log4j.properties 檔案中記錄了hive日誌的...