hive遺留問題

hive和mysql有什麼不同

  • 1.不支持下列from a,b where用法

SQL中對兩表內聯可以寫成:select * from dual a,dual b where a.key = b.key; 
Hive中應爲:select * from dual a join dual b on a.key = b.key

  • 2.不能智能識別concat(‘;’,key),只會將‘;’當做SQL結束符號
  • 3.不支持INSERT INTO 表 Values(), UPDATE, DELETE等操作 
  • 4.HiveQL中String類型的字段若是空(empty)字符串, 即長度爲0, 那麼對它進行IS NULL的判斷結果是False
  • 5.join的時候不支持非等值連接
  • 6.on中不支持or
  • 7.對於orderby語句,必然要使用limit語句(防止reducer額外執行很長時間)

關於5,join的時候不支持非等值連接怎麼處理

處理辦法1:把非等值連接的key放在case when語句

處理辦法2:把非等值連接放在where之後再用大表left join避免缺失信息

處理3:如果不存在等值連接 只存在等值連接的做法  :on true

SELECT *
FROM table1
RIGHT JOIN table2
ON table2.x LIKE CONCAT('%' , table2.y , '%')

轉化hive

SELECT *
FROM table1
RIGHT JOIN table2
ON(TRUE)
WHERE instr(table1.y,table2.x)>0

4.hive中null的存儲方式

1)不同數據類型對空值的存儲規則

int與string類型數據存儲,null默認存儲爲 \N;外表展示爲null,可以用is null識別

string類型的數據如果爲"",存儲則是"",這個時候外表展示不是null,所以不能用is null識別

另外往int類型的字段插入數據“”時,結果還是\N

因此在不設置任何參數情況下,int數據的null可以用is null識別;但是string類型中既想取null又想取空字符串‘’【一定意義下也是確實值】就不能只用is null了

2)解決辦法

2.1 再加一個條件:通過 a=''  或者 length(a)=0

2.2 設置參數 SET SERDEPROPERTIES('serialization.null.format' = '') 這樣內部null表示爲‘’,外表爲null,就可以只使用一個條件is null來識別

參考鏈接:http://www.voidcn.com/article/p-aahpewna-bpb.html

6.hive大表連接小表:設置mapjoin【提高性能】

  hive大表連接大表:設置SMBjoin【提高性能】

詳情:https://www.cnblogs.com/raymoc/p/5323824.html

7.幾個有關null的函數

  1. 1.NVL函數   
  2.   NVL函數的格式如下:NVL(expr1,expr2)   
  3.   如果oracle第一個參數爲空那麼顯示第二個參數的值,如果第一個參數的值不爲空,則顯示第一個參數本來的值。   
  4. 2.NVL2函數   
  5.   NVL2函數的格式如下:NVL2(expr1,expr2, expr3)   
  6.   如果該函數的第一個參數爲空那麼顯示第三個參數的值,如果第一個參數的值不爲空,則顯示第二個參數的值。   
  7. 3.NULLIF函數   
  8.   NULLIF(exp1,expr2)   
  9.   函數的作用是如果exp1和exp2相等則返回空(NULL),否則返回第一個值   
  10. 4.Coalesce函數   
  11.   Coalesce(expr1, expr2, expr3….. exprn)   
  12.   一句話就是顯示第一個不爲空的參數。如果全部爲空則返回空.

8.多表join連接時,如果每個on子句都使用相同的連接鍵的話,那麼只會產生一個mapreduce job

select 
    *
from
    table t1
join 
    table t2
on 
    t1.key=t2.key
join
    table t3
on
    t1.key=t3.key   -- 不要用t2.key=t3.key

9.hive假定查詢中最後一個表是最大的那個表,在對每行記錄進行聯結操作是,他會嘗試將其他表緩存起來,然後掃描最後那個表進行計算,因此最好表的大小從左到右依次遞增

 

10.大表聯結小表用mapjoin可以忽略掉常規的reduce操作

11.create database if not exists table_name

12.overwrite關鍵字會覆蓋

insert overwrite table table_name 
parition (country = 'US',state = 'OR')
select * from table_name2 as se
where se.cnty = 'US' and se.st = 'OR';

下面這個沒有overwrite關鍵字的只是追加不會覆蓋

insert into table table_name 
parition (country = 'US',state = 'OR')
select * from table_name2 as se
where se.cnty = 'US' and se.st = 'OR';

13.浮點數的比較

0.2對於float類型來說是0.2000001對於double來說是0.20000000001

當表中的float值通過hive轉換爲double時,產生的double值是0.2000001,要比0.20000000001 大,因此

select * from employee as e where tax > 0.2;會發現tax=0.2值也會出現

規避方法

select * from employee as e where tax > cast (0.2 as float)

14.抽樣

select * from numbers tablesample(bucket 3 out of 10 on rand()) S;

15.sql調優補充

a。用exists/join代替in

b。能用where過濾的不要having

c。使用索引

d。索引條件涉及到計算時,將計算式子放在右邊,索引上面不要加;id>=100/2(OK) id*2>=100(NO)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章