HiveQL 去重操做負載均衡
和SQL同樣,HiveQL中一樣支持DISTINCT操做,以下示例:ide
(1) SELECT count(DISTINCT uid) FROM log(2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip
(3) SELECT ip, count(DISTINCT uid, uname) FROM log GROUP BY ip
(4) SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROM log GROUP BY ipui
當咱們使用Hive QL中的去重關鍵字DISTINCT時,須要注意的一點是:在多個列上進行的去重操做與hive環境變量hive.groupby.skewindata存在關係。當hive.groupby.skewindata=true時,hive不支持多列上的去重操做,並報錯:Error in semantic analysis: DISTINCT on different columns not supported with skew in data. 注意:上面示例中的(3)不屬於多列上的DISTINCT操做。Group By 語句spa
Map 端部分聚合:ip
並非全部的聚合操做都須要在 Reduce 端完成,不少聚合操做均可以先在 Map 端進行部分聚合,最後在 Reduce 端得出最終結果。it
基於 Hash參數包括:io
hive.map.aggr = true是否在 Map 端進行聚合,默認爲 Truefunction
hive.groupby.mapaggr.checkinterval = 100000在 Map 端進行聚合操做的條目數目class
有數據傾斜的時候進行負載均衡變量
hive.groupby.skewindata = false當選項設定爲 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到 Reduce 中,每一個 Reduce 作部分聚合操做,並輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不一樣的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分佈到 Reduce 中(這個過程能夠保證相同的 Group By Key 被分佈到同一個 Reduce 中),最後完成最終的聚合操做。
從上面group by語句能夠看出,這個變量是用於控制負載均衡的。當數據出現傾斜時,若是該變量設置爲true,那麼Hive會自動進行負載均衡。
HIVE-2416
Currently when multiple distinct function is used, hive.groupby.skewindata optimization parameter shall be set false, or else an exception is raised:Error in semantic analysis: DISTINCT on different columns not supported with skew in dataSkew groupby should support multiple distinct function.