hive 三 排序和優化

2021-08-21 07:56:49 字數 1623 閱讀 1044

排序:

order by:

全域性排序,執行乙個reduce任務

sort by:

在乙個reduce任務中的資料是有序的,但是總體資料看是無序的。如果只是執行乙個reduce任務和order by是一樣的。

通過set   mapreduce.job.reduces=num  設定reduce任務的數量。資料的分到不同的reduce預設使用hash演算法。

distribute by:

分割槽排序,指定以什麼字段進行分割槽排序,結合sort by使用。select * from testa distribute by field1 sort by field2.

需要注意的是distribute by需要在sort by之前,這是因為需要先指定分割槽。

cluster by:

當distribute by和sort by選擇的字段是一樣的時候,直接使用cluster by效果是一樣的。

hive優化:

1.fetchtask  取消某些mr

修改配置檔案 hive-site.xml:

hive.fetch.task.conversion

more

2.表拆分(子表)

3.分割槽表,外部表 結合使用 多級分割槽 (month,day,hour)

5.sql優化  先filter後join

reduce join:

表join發生在reduce階段 通常是兩個較大表join   每個表的資料都是從檔案中讀取的

map join:

表join發生在map階段 通常是一大一小的表join  大表資料從檔案中讀取,小表資料從記憶體中讀取   通過distributedcache 類將小表資料快取到各個節點中

smb join:sort-merge-bucket 在大表join時進行優化

在建立表時以jion欄位進行分割槽排序,將排序完成的資料劃分到不同的bucket(分割槽)中。大表join的時候就會根據對應的bucket進行join,減少查詢對錶的次數。 官網

6.資料傾斜:group by ,distinct

hive執行計畫:

顯示執行計畫:explain extended select ***

hive在job中沒有依賴關係時,可以設定並行執行:

最多可以並行執行多少個作業:hive.exec.parallel.thread.number  一般在10~20    

是否並行執行作業:   hive.exec.parallel  預設是false

jvm重用:就是在乙個jvm中啟動多個mr   mapreduce.job.jvm.numtasks    不要超過9個

設定map數目: hive.merge.size.per.task  通過設定map讀取最大檔案的值來控制map的數量

設定reduce數目:mapreduce.job.reduces 

通過資料測試每個reduce完成的時間,修改reduce數量。將所有reduce完成任務的時間控制在一定範圍內。

mapreduce.reduce.speculative 都設定為false  預設為true

動態分割槽: 

開啟動態分割槽 hive.exec.dynamic.partition=true  預設是false   更多配置

三 排序演算法

所有例子都是公升序排序。資料分成兩部分 已排序和待排序。排序過程中,資料移動分為兩種 1.直接移動 移動資料的儲存位置,消耗時間 2.邏輯移動 改變指向這些資料的指標 特點 遍歷待排序資料,把最小值與起始資料 最左邊 交換位置 次數 第一輪n 1次,第k輪n k次 步驟 1.如果待排序資料大於0,則...

演算法基礎(三) 排序

我們先來看看幾種排序的結構圖 排序是否穩定 比如 排序前 25 7 6 4 29 3 排序後 22 3 4 5 6 7 9 排序前藍2在紅 2前面,排序後藍 2依然在紅 2前面,則所用的排序方法是穩定的。如果排序後,紅 2有可能在藍 2前面,那麼所用的排序方法是不穩定的 下面說說前面幾種排序的時間複...

三 排序 幸運數字

問題 幸運數字 題目描述 笨小猴的詞彙量很小,所以每次做英語選擇題的時候都很頭疼。但是他找到了一種方法,經試驗證明,用這種方法去選擇選項的時候選對的機率非常大!這種方法的具體描述如下 假設maxn是單詞中出現次數最多的字母的出現次數,minn是單詞中出現次數最少的字母的出現次數,如果maxn min...