閱讀504 返回首頁    go 阿裏雲 go 技術社區[雲棲]


hive中的排序和分組


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=<number>),對數的數據在執行歸並排序,即可得到全部結果.

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


distribute by


cluster by






最後更新:2017-10-25 22:03:45

  上一篇:go  精準垃圾郵
  下一篇:go  VS2015+OpenCV3.3.0+QT5.9.2 Demo