Hive采用了類SQL的查詢語言HQL (hive query language)。除了HQL之外,無任何相似的地方。
Hive是為了數(shù)據(jù)倉庫設(shè)計的。
- 1、存儲位置: Hive在Hadoop上; Mysql 將數(shù)據(jù)存儲在設(shè)備或本地系統(tǒng)中;
- 2、數(shù)據(jù)更新: Hive不支持?jǐn)?shù)據(jù)的改寫和添加,是在加載的時候就已經(jīng)確定好了;數(shù)據(jù)庫可以CRUD;
- 3、索引: Hive無索引,每次掃描所有數(shù)據(jù),底層是MR,并行計算, 適用于大數(shù)據(jù)量; MySQL有索引 , 適給在線查詢數(shù)據(jù);
- 4、執(zhí)行: Hive底層是MarReduce ; MySQL底層是執(zhí)行引擎;
- 5、可擴(kuò)展性: Hive: 大數(shù)據(jù)量; MySQL: 相對就很少了。
- 6、Hive不支持事務(wù)
1、hive不支持將數(shù)據(jù)插入現(xiàn)有的表或分區(qū),僅支持覆蓋重寫整張表
- hive sql沒有update、insert into類的更新表或插入表的操作
- 關(guān)于這個很多人都寫了不支持,但是在Hive的之前版本已經(jīng)新增了這幾個命令,現(xiàn)在是可以使用的
2、hive sql特殊字符拼接問題,如分號要先進(jìn)行八進(jìn)制的ASCII碼轉(zhuǎn)義。
- 不能智能識別concat(‘;’,key),只會將 ‘ ;’ 當(dāng)做SQL結(jié)束符號。
MySQL:
select concat(key,concat(';',key)) from dual;
hivesql:
select concat(key,concat('\073',key)) from dual;
將分號的用其八進(jìn)制的ASCII碼進(jìn)行轉(zhuǎn)義
3、hive sql不支持非等值連接,sql支持非等值連接
hive中把不相等的情況拿出來時,無法直接寫字段A<>字段B,否則會報錯。
想從一個訂單表中,剔除測試用戶的訂單,該如何實(shí)現(xiàn)呢?使用left join
select a.uid,a.orderid
from table1 a --訂單表
left join table2 b --測試用戶id表
on a.uid = b.uid
where b.uid is null
4、Hive中關(guān)于null 的存儲與SQL不同:
在傳統(tǒng)數(shù)據(jù)庫中字段沒有值或者為空即表示為NULL,但是在hive中默認(rèn)的NULL值是\N。
在hive中會把文本的\N解析為NULL。在使用IS NULL 或者IS NOT NULL時會過濾數(shù)據(jù)。
如果想延續(xù)傳統(tǒng)數(shù)據(jù)庫中對于空值為NULL,可以通過alter語句來修改hive表的信息,保證解析時是按照空值來解析NULL值。語句如下:
alter table ljn005
SETSERDEPROPERTIES('serialization.null.format' ='');
這樣就可以修改默認(rèn)的NULL值的定義了。比如這里定義
alter table ljn005
SETSERDEPROPERTIES('serialization.null.format' ='abc');
5、函數(shù)使用不同:
- 如分隔字符串:
MySQL:
select substring_index("1,2,3",",",1); # 返回結(jié)果:1
select substring_index("1,2,3",",",3); # 返回結(jié)果:1,2,3
Hivesql:
select split("1,2,3", ',')[0]; # 返回結(jié)果:1
select split("1,2,3", ',')[2]; # 返回結(jié)果:3
- 時間轉(zhuǎn)換函數(shù):
MySQL:
select p_id , from_unixtime(p_create_time/1000,'%y-%m-%d') as times
from poi
where p_parent_id= 4782760
hivesql:
select p_id , from_unixtime(p_create_time div 1000,'YYYY-MM-dd HH:mm:ss') as times
from poi
where p_parent_id= 4782760
6、hive支持將轉(zhuǎn)換后的數(shù)據(jù)直接寫入不同的表,還能寫入分區(qū)、hdfs和本地目錄; SQL落地到文件
- 這樣能免除多次掃描輸入表的開銷。
7、不支持 ‘< dt <’這種格式的范圍查找,可以用dt in(”,”)或者between替代。
8、建表語句不一樣,hive有列分割,按字段分割,sql沒有
hive中在創(chuàng)建表時,一般會根據(jù)導(dǎo)入的數(shù)據(jù)格式來指定字段分隔符和列分隔符。
一般導(dǎo)入的文本數(shù)據(jù)字段分隔符多為逗號分隔符或者制表符(但是實(shí)際開發(fā)中一般不用著這種容易在文本內(nèi)容中出現(xiàn)的的符號作為分隔符),當(dāng)然也有一些別的分隔符,也可以自定義分隔符。有時候也會使用hive默認(rèn)的分隔符來存儲數(shù)據(jù)。
分隔符詳解:https://blog.csdn.net/qq_26442553/article/details/80297028