天天看點

Hive order by、sort by、distribute byORDER BYSORT BYDISTRIBUTE BY

ORDER BY

Hive中的ORDER By和其他的SQL中的定義時一樣的,用于對查詢結果進行一個統一的排序。在Hive中,該語句會将所有的資料都通過一個reducer進行處理,對于大資料集會是一個瓶頸。

Hive中的order by語句有一些限制,在strict模式下(hive.mapred.mode=strict),order by語句後面需要跟上limit 語句,原因在于order by是全局排序,使用的是一個reducer,大的資料集場景下會需要非常久的時間,是以Hive對其進行了限制。如果使用nostrict模式,則不需要該限制。

Hive 3.0.0之後,子查詢或試圖中的order by若是沒有limit,則優化器會将其order by移除,可以使用

hive.remove.orderby.in.subquery

來禁用該特性。

SORT BY

SORT BY是Hive中特有的一種語句,其隻會在每個reducer中對資料進行一個局部排序,保證每個reducer的輸出都是有序的,這樣可以提高之後全局排序的效率。

Hive 3.0.0之後,子查詢或試圖中的sort by若是沒有limit,則優化器會将其order by移除,可以使用

hive.remove.orderby.in.subquery

來禁用該特性。

DISTRIBUTE BY

DISTRIBUTE BY控制在map的輸出在reducer是如何劃分的。預設情況下,MapReduce架構會根據map資料的key計算其hash值,然後根據該hash值分發到reducer中,使用了DISTRIBUTED BY時,可以保證DISTRIBUTED BY指定的列值相同時能夠分發到同一個reducer中進行處理。

DISTRIBUTE BY不允許cluster by 或者是 sort by 使用DIS

含有SORT BY的DISTRIBUTE BY

在使用SORT BY時會出現不同Reducer的輸出内容會有明顯的重疊,如:

// ymd:年月日,symbol:交易碼, price_close: 價格
SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
SORT BY s.symbol ASC, s.ymd ASC;
           

以上例子中會出現同一個symbol的股票資料分布在多個reducer中,是以其結果會有重疊。

該場景下使用DISTRIBUTE BY能夠有效的防止該情況。

SELECT s.ymd, s.symbol, s.price_close
FROM stocks s
DISTRIBUTE BU s.symbol
SORT BY s.symbol ASC, s.ymd ASC;
           

DISTRIBUTE BY和GROUP BY在控制着reducer是如何接受一行行資料處理方面是類似的,而SORT BY則控制着reducer内的資料是如何進行排序的。

需要注意的是,DISTRIBUTE BY語句需要寫在SORT BY語句之前。

繼續閱讀