hive中的order by語句和關聯式資料庫中的sql語法相似。他會對查詢結果做全域性排序,這意味著所有的資料會傳送到乙個reduce任務上,這樣會導致在大數量的情況下,花費大量時間。
與資料庫中 order by 的區別在於在hive.mapred.mode = strict
模式下,必須指定 limit 否則執行會報錯。
hive
>
sethive
.mapred
.mode
=strict
;hive
>
select
*from
test
order
byid
;failed
:semanticexception1:
28in
strict
mode,if
order
byis
specified
,limit
must
also
bespecified
.error
encountered
near
token
'id'
例子:
hive> set hive.mapred.mode=unstrict;
hive> select * from test order by id ;
mapreduce jobs launched:
job 0: map: 1 reduce: 1 cumulative cpu: 1.88 sec hdfs read: 305 hdfs write: 32 success
total mapreduce cpu time spent: 1 seconds 880 msec
ok1 a
1 a2 b
2 b3 c
3 c4 d
4 dtime taken: 24.609 seconds, fetched: 8 row(s)
從上面的日誌可以看到:啟動了乙個reduce進行全域性排序。
sort by不是全域性排序,其在資料進入reducer前完成排序,因此在有多個reduce任務情況下,sort by只能保證每個reduce的輸出有序,而不能保證全域性有序。
hive.mapred.mode
你可以通過設定mapred.reduce.tasks
的值來控制reduce的數,然後對reduce輸出的結果做二次排序。
例子:
hive
>
setmapred
.reduce
.tasks=3
;hive
>
select
*from
test
sort
byid
;mapreduce
jobs
launched
:job0:
map:
1reduce:3
cumulative
cpu:4.
48sec
hdfs
read
:305
hdfs
write:32
success
total
mapreduce
cputime
spent:4
seconds
480msecok1
a2b3
c4d2
b3c4
d1atime
taken:29
.574
seconds
,fetched:8
row(
s)
從上面的日誌可以看到:啟動了三個reduce分別排序,最後的結果不是有序的。
distribute by能夠控制map的輸出在reduce中如何劃分。其可以按照指定的字段對資料進行劃分到不同的輸出reduce/檔案中。
distribute by和group by有點類似,distribute by控制reduce如何處理資料,而sort by控制reduce中的資料如何排序。
注意:hive要求distribute by語句出現在sort by語句之前。例子:
hive
>
select
*from
test
distribute
byid
sort
byid
asc;
job0
:map:1
reduce:3
cumulative
cpu:4.
24sec
hdfs
read
:305
hdfs
write:32
success
total
mapreduce
cputime
spent:4
seconds
240msecok3
c3c1
a1a4
d4d2
b2btime
taken:29
.89seconds
,fetched:8
row(
s)
從上面的日誌可以看到:啟動了三個reduce分別排序,最後的結果不是有序的。
當distribute by的字段和sort by的字段相同時,可以用cluster by來代替 distribute by with sort by。
注意:cluster by不能新增desc或者asc。例子:
hive
>
select
*from
test
cluster
byid
asc;
failed
:parseexception
line1:
33extraneous
input
'asc'
expecting
eofnear
''
hive
>
select
*from
test
cluster
byid
;mapreduce
jobs
launched
:job0:
map:
1reduce:3
cumulative
cpu:4.
58sec
hdfs
read
:305
hdfs
write:32
success
total
mapreduce
cputime
spent:4
seconds
580msecok3
c3c1
a1a4
d4d2
b2btime
taken:30
.646
seconds
,fetched:8
row(
s)
從上面的日誌可以看到:啟動了三個reduce分別排序,最後的結果不是有序的。
怎樣讓最後的結果是有序的呢?
可以這樣做:
hive
>
selecta.
*from
(select
*from
test
cluster
byid)a
orderbya
.id;mapreduce
jobs
launched
:job0:
map:
1reduce:3
cumulative
cpu:4.
5sec
hdfs
read
:305
hdfs
write
:448
success
job1
:map:1
reduce:1
cumulative
cpu:1.
96sec
hdfs
read
:1232
hdfs
write:32
success
total
mapreduce
cputime
spent:6
seconds
460msecok1
a1a2
b2b3
c3c4
d4dtime
taken
:118
.261
seconds
,fetched:8
row(
s)
hive中的全排序
寫mapreduce程式時,如果reduce個數 1,想要實現全排序需要控制好map的輸出,詳見 hadoop簡單實現全排序 現在學了hive,寫sql大家都很熟悉,如果乙個order by解決了全排序還用那麼麻煩寫mapreduce函式嗎?事實上,hive使用order by會預設設定reduce...
hive中的排序和分組
order by order by 會對輸入坐全域性排序,因此 只有乙個reducer 多個reducer會無法保證全域性有序 只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間.set hive.mapred.mode nonstrict default value 預設值 set...
hive查詢中的排序總結
四個排序總結 order by 全域性排序 reduce啟動個數為乙個 sort by 區內排序和distrbute by 結合使用 reduce個數為多個 distribute by 同上reduce個數為多個 cluster by 當distribute by 和 sort by相同時 使用。r...