hive的幾個排序

2021-09-21 21:36:57 字數 1870 閱讀 2932

hive中常用的幾個排序

order by   #全域性排序,因為是全域性排序,所以job是乙個reduce,reduce的個數引數設定對其無效

sort by    #乙個reduce時為全域性排序,多個reduce時,每個reduce各自排序,為了提高全域性排序的效能,可以先用sort by做區域性排序,然後再做全域性排序

distribute by #hash 分組,根據key和reduce個數進行資料分發,預設使用hash的方式

cluster by #distribute by + sort by(注意和hive.enforce.bucketing引數的應用)

結合兩個例子來看排序的應用:

1)cdnjob的優化思路

熟悉map slot的分配規則的同學應該知道,text gz的檔案是不支援split的,因此這種情況下最多只有乙個map(不管資料量多大),

這樣在做資料處理時,如果檔案很大而且計算邏輯比較複雜(比如cdn的報表,需要做各種聚合計算和ip位址的解析),效率就會比較低下。

乙個思路就是建乙個中間表,對原始表進行distribute by,對中間表進行複雜的計算,這樣就可以使用多個map,提高運算效率。

2)solr測試的思路

測試hive2solr時,需要模擬乙個檔案和多個檔案的寫入情況。

預設使用的sql是 1

insert into table ***select* from data_for_sol;

這是乙個hdfs操作,不涉及mapred,不太好模擬多個檔案的寫入情況。

可以在後面套乙個 distribute by ,並合理設定reduce的數量(mapred.reduce.tasks),這樣就會生成多個reduce的檔案。

1

insert into table ***select* from data_for_solr distribute by session_id;

注意:reduce slot的分配由下面幾個情況決定

1)sql型別(比如order by只有乙個reduce)

2)引數 1

mapred.reduce.tasks;

每個任務reduce的預設值,預設為-1,-1 代表自動根據作業的情況來設定reduce的值,優先順序高於下面兩個設定。

1

hive.exec.reducers.bytes.per.reducer

根據reduce的輸入資料(map端的輸出資料,不管是否壓縮),大小判斷reduce的個數,預設1g

hive.exec.reducers.max reduce的最大數量,預設999個

計算方法: 1

2

3

4

5

reducers = (int) ((totalinputfilesize + bytesperreducer - 1) / bytesperreducer);

reducers = math.max(1, reducers);

reducers = math.min(maxreducers, reducers);

關於map/reduceslot的分配規則以後有機會再說。

hive中幾個排序方式的區別

order by hive中的order by 和傳統sql中的order by 一樣,對資料做全域性排序,加上排序,會新啟動乙個job進行排序,會把所有資料放到同乙個reduce中進行處理,不管資料多少,不管檔案多少,都啟用乙個reduce進行處理。如果指定了hive.mapred.mode st...

hive 幾個join的差別彙總

employee表 department表 共4 2 8條結果。select from employee a inner join department b on a.departmentid b.id 等價於 返回滿足連線條件的左邊表的所有記錄,若左邊表的某些記錄在右邊表中沒有匹配記錄,右邊表則顯...

Hive資料排序

set hive.groupby.orderby.position.alias true 案例 select name,id,info from employee id order by info.age select name,id from employee id order by 2 desc...