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