我想說的select top n是取最大前n條或者最小前n條。
hive提供了limit關鍵字,再配合order by可以很容易地實現select top n。
但是在hive中order by只能使用1個reduce,如果表的資料量很大,那麼order by就會力不從心。
例如我們執行sql:select a from ljntest01 order by a limit 10;
控制台會列印出:number of reduce tasks determined at compile time: 1
說明啟動的reduce數量是編譯時確定的。
檢視該sql的執行計畫,該sql只啟動1個job。
假設資料表有1億條資料,而我們只想取top 10,那對1億條資料在1個reduce中做全排序是非常不合理的。
幸好有sort by,使用sort by替換order by就可以解決這個問題:
select a from ljntest01 sort by a limit 10;
首先執行該sql控制台列印出:number of reduce tasks not specified. estimated from input data size: 1
說明reduce數不是編譯時確定的,而是根據輸入檔案大小動態確定的。
此外檢視該sql的執行計畫:
stage dependencies:
stage-1 is a root stage
stage-2 depends on stages: stage-1
stage-0 is a root stage
stage plans:
stage: stage-1
map reduce
alias -> map operator tree:
ljntest01
tablescan
alias: ljntest01
select operator
expressions:
expr: a
type: int
outputcolumnnames: _col0
reduce output operator
key expressions:
expr: _col0
type: int
sort order: +
tag: -1
value expressions:
expr: _col0
type: int
reduce operator tree:
extract
limit
file output operator
compressed: true
globaltableid: 0
table:
input format: org.apache.hadoop.mapred.sequencefileinputformat
output format: org.apache.hadoop.hive.ql.io.hivesequencefileoutputformat
stage: stage-2
map reduce
alias -> map operator tree:
hdfs://hdpnn:9000/group/alidw-cbu/tmp/hive-admin/hive_2012-12-16_01-19-42_893_2878471909568139281/-mr-10002
reduce output operator
key expressions:
expr: _col0
type: int
sort order: +
tag: -1
value expressions:
expr: _col0
type: int
reduce operator tree:
extract
limit
file output operator
compressed: true
globaltableid: 0
table:
input format: org.apache.hadoop.mapred.textinputformat
output format: org.apache.hadoop.hive.ql.io.hiveignorekeytextoutputformat
stage: stage-0
fetch operator
limit: 10
sort by可以啟動多個reduce,每個reduce做區域性排序,但是這對於sort by limit n已經夠用了。從執行計畫中可以看出sort by limit n啟動了兩個job。第乙個job是在每個reduce中做區域性排序,然後分別取top n。假設啟動了m個reduce,第二個job再對m個reduce分別區域性排好序的總計m * n條資料做全域性排序,取top n,從而得到想要的結果。這樣就可以大大提高select top n的效率。
讓UNION與ORDER BY並存於SQL語句當中
在sql語句中,union關鍵字多用來將並列的多組查詢結果 表 合併成乙個結果 表 簡單例項如下 上面的 可以實現將從product1和product2兩張表合併成乙個表,如果您只是希望合併兩張表中符合特定條件的記錄抑或是合併兩張表各自的前n條記錄,那麼您的 可能會像下面這樣寫 wherelen n...
spark關於分割槽和sortBy的學習
首次學習spark時,對分割槽沒有直觀的了解,在使用sortby方式時也不能得預期的結果,通過實踐了解spark分割槽和sortby的原理 val sc new sparkcontext conf master設定為 local 4 利用4個執行緒 executor 來測試,模擬分布式環境 val ...
spark關於分割槽和sortBy的學習
學習目的 首次學習spark時,對分割槽沒有直觀的了解,在使用sortby方式時也不能得預期的結果,通過實踐了解spark分割槽和sortby的原理 partitionindex1 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45...