Hive中的排序語法

2021-09-23 21:06:44 字數 4646 閱讀 8671

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...