Hive Tips

 

1.篩選變量值中包含特殊符號的值;

選取出名字中包含下劃線的名字,如name=AB_TEST;sql

 select * from emp where name like '%_%';  
-- 此方法的獲得的結果是所有的名字,而不僅是咱們想要的AB_TEST,
-- 由於在HQL模糊查詢中,'%'表示任意一個或多個字符,'_'表示任意一個字符。
-- 因此'%_%'的寫法並不能篩選出AB_TEST;

爲了讓'_'表示它自己,應該用轉義字符;
select * from emp where name like '%\\_%';
-- 第一個'\'表示的是它是一個轉義字符的含義; 而第二'\'表示的是轉義字符,此時'-' 表示的是它自己的含義;

2.Hive 排序中NULL的處理;

order by後面能夠接列的位置時,需設置參數:負載均衡

set hive.groupby.orderby.position.alias=true;
true:可使用列的位置; false:不可使用列的位置;

在升序排序時,空值(Null)默認排在結果集最前面,在降序排序時,空值(Null)默認排在結果集最後面;ui

3.Hive Not in後接的子查詢中不能有空值; spa

但在實際操做時發現,子查詢中有空值並不會致使最終結果有影響;.net

4.Hive 啓用客戶端方式(具體操做還不清楚,待後續跟進);code

啓動客戶端方式的方法:hive --service hiveserver;server

5.和SQL同樣,HiveQL中一樣支持DISTINCT操做,以下示例:blog

此部分轉至:http://blog.csdn.net/zj360202/article/details/38420575排序

(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) FROMlog GROUP BY ip
(4) SELECT ip, count(DISTINCTuid), count(DISTINCT uname) FROMlog GROUP BY ip

當咱們使用Hive QL中的去重關鍵字DISTINCT時,須要注意的一點是:
在多個列上進行的去重操做與hive環境變量hive.groupby.skewindata存在關係。
當hive.groupby.skewindata=true時,hive不支持多列上的去重操做,並報錯:ip

Error in semantic analysis: DISTINCT on different columns notsupported with skew in data. 

注意:上面示例中的(3)不屬於多列上的DISTINCT操做。

select mac,count(1) from log group by mac;

當某一個mac的值很是多,若是幾個mac的hash是同樣的,會分到一個reduce,且數量已經超過一個reduce的容量或是處理能力的時候,上面的語句改爲 :

hive.groupby.skewindata=true;  
select mac,count(1) from log group by mac;

 

Group By 語句

  • Map 端部分聚合:
    • 並非全部的聚合操做都須要在 Reduce 端完成,不少聚合操做均可以先在 Map 端進行部分聚合,最後在 Reduce端得出最終結果。
    • 基於 Hash
    • 參數包括:
      • hive.map.aggr = true 是否在 Map 端進行聚合,默認爲True
      • hive.groupby.mapaggr.checkinterval =100000 在 Map 端進行聚合操做的條目數目
  • 有數據傾斜的時候進行負載均衡
    • hive.groupby.skewindata = false
    • 當選項設定爲 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到Reduce 中,每一個 Reduce 作部分聚合操做,並輸出結果,這樣處理的結果是相同的 Group By Key有可能被分發到不一樣的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group ByKey 分佈到 Reduce 中(這個過程能夠保證相同的 Group By Key 被分佈到同一個 Reduce中),最後完成最終的聚合操做。

hive.groupby.skewindata變量

從上面groupby語句能夠看出,這個變量是用於控制負載均衡的。當數據出現傾斜時,若是該變量設置爲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 data

Skew groupby should support multiple distinct function.

相關文章
相關標籤/搜索