hive中的排序和分組

2021-09-22 23:56:47 字數 1500 閱讀 8948

order by

order by 會對輸入坐全域性排序,因此 只有乙個reducer(多個reducer會無法保證全域性有序)只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間.

set hive.mapred.mode =nonstrict;(default value/預設值)

set hive.mapred.mode =strict;

order by 和資料庫中的order by 功能一致,按照某一項或幾項的排序輸出.

與資料庫中order by 的區別在於在 hive.mapred.mode=strict 模式下 必須指定limit 否則執行會報錯.

hive>select * from test order by id;

failed: error in semantic analysis: 1:28 in strict mode, if order by is specified, limit must also be specified. error encountered near token 'id'

原因:在order by 狀態下所有資料回到一台伺服器進行reduce 操作也只有乙個reduce,如果在資料量大的情況下會出現無法輸出結果的情況,如果進行limit n 那只有 n*map number條記錄而已.只有乙個reduce也可以處理過來.

sort by

sort by 不是全域性排序,其在資料進入reducer前完成排序.

因此,如果用sort by 進行排序,並且排序mapred.reduce.tasks>1 則sort by 只保證每個reducer的輸出有序 不會保證全域性的有序.

sort by 不受 hive.mapred.mode 是否為 stric ,nostrict 的影響

sort by 的資料只能保證在同乙個reduce中的資料可以按指定字段排序.

使用sort by 你可以制定執行的reduce個數 (set mapred.reduce.tesks=),對數的資料在執行歸併排序,即可得到全部結果.

注意:樂意用limit子句大大減少資料量 使用limit n 後 傳輸到reduce 端 (單機) 的資料記錄數量減少到n*(map個數)否則由於資料過大可能出不了結果.

distribute by

按照指定的字段對資料進行劃分到不同的輸出 reduce / 檔案中

insert overwrite local directory '/home/hadoop/out' select * from test order by name distribute by length(name);

此方法會根據name的長度劃分到不同的reduce中 ,最終輸出到不同的檔案中

leng 是內建函式 也可以指定其他函式或者使用自定義函式

cluster by

cluster by 除具有 distribute by 的功能外還兼具 sort by的功能

但是排序只能是倒排序 不能指定排序規則為asc 或者desc.

hive 分組排序,topN

hive 分組排序,topn 語法格式 row number over partition by col1 order by col2 desc rank partition by 類似hive的建表,分割槽的意思 order by 排序,預設是公升序,加desc降序 rank 表示別名 表示根據c...

HIVE中視窗函式 分組排序

hive row number over 直接排序,10個第1名排名為1到10 select user id,pay time,amont,row number over partition by user id order by amont desc rank from tmp rank over...

hive 的分組排序用法與 Impala 分組排序

hive 的分組排序用法與 impala 分組排序 hive支援兩種語法 row number over partition by 分組的字段 order by 排序的字段 as rank rank 可隨意定義表示排序的標識 row number over distribute by 分組的字段 s...