hive的order by語句分析

2021-07-14 23:42:37 字數 1512 閱讀 4821

hive中的order by跟傳統的sql語言中的order by作用是一樣的,會對查詢的結果做一次全域性排序,所以說,只有hive的sql中制定了order by所有的資料都會到同乙個reducer進行處理(不管有多少map,也不管檔案有多少的block只會啟動乙個reducer)。但是對於大量資料這 將會消耗很長的時間去執行。

這裡跟傳統的sql還有一點區別:如果指定了hive.mapred.mode=strict(預設值是nonstrict),這時就必須指定limit 來限制輸出條數,原因是:所有的資料都會在同乙個reducer端進行,資料量大的情況下可能不能出結果,那麼在這樣的嚴格模式下,必須指定輸出的條數。

所以資料量大的時候能不用order by就不用,可以使用sort by結合distribute by來進行實現。sort by是區域性排序,而distribute by是控制map怎麼劃分reducer。

hive中指定了sort by,那麼在每個reducer端都會做排序,也就是說保證了區域性有序(每個reducer出來的資料是有序的,但是不能保證所有的資料是有序的,除非只有乙個reducer),好處是:執行了區域性排序之後可以為接下去的全域性排序提高不少的效率(其實就是做一次歸併排序就可以做到全域性排序了)

ditribute by是控制map的輸出在reducer是如何劃分的,舉個例子,我們有一張表,mid是指這個store所屬的商戶,money是這個商戶的盈利,name是這個store的名字

store:

midmoney

name

aa15.0

商店1aa

20.0

商店2bb

22.0

商店3cc

44.0

商店4

執行hive語句:

select mid, money, name from store distribute by mid sort by mid asc, money asc

我 們所有的mid相同的資料會被送到同乙個reducer去處理,這就是因為指定了distribute by mid,這樣的話就可以統計出每個商戶中各個商店盈利的排序了(這個肯定是全域性有序的,因為相同的商戶會放到同乙個reducer去處理)。這裡需要注意 的是distribute by必須要寫在sort by之前。

cluster by的功能就是distribute by和sort by相結合,如下2個語句是等價的:

select mid, money, name from store cluster by mid

select mid, money, name from store distribute by mid sort by mid

如果需要獲得與上面的中語句一樣的效果:

select mid, money, name from store cluster by mid sort by money

注意被cluster by指定的列只能是降序,不能指定asc和desc。

優化orderby語句

資料庫排序在很多業務系統都有這方面的硬性要求,但是很多情況下大資料表的排序查詢很是緩慢,查了下資料,現在總結如下 可以適當調大 sort area size 的值 10240000 10m alter system set sort area size 10240000 scope spfile 在...

優化 ORDER BY 語句

一 mysql 中兩種排序方式 1 第一種通過有序索引順序掃瞄直接返回有序資料,這種方式在使用 explain 分析查詢的時候顯示為 using index 即通過索引列就能返回所需要的資料 不需要額外的排序,操作效率較高。mysql explain select customer id from ...

TOP語句與Order By語句

預設情況下,如果在子查詢,函式,檢視中嘗試去使用order by,create view dbo.vsortedorders asselect orderid,customerid from dbo.orders order by orderid go那麼可能會遇到下面的錯誤 訊息 1033,級別 ...