Hive采用了類SQL的查詢語言HQL (hive query language)。除了HQL之外,無任何相似的地方脉执。
Hive是為了數(shù)據(jù)倉庫設(shè)計(jì)的。
- 1戒劫、存儲(chǔ)位置: Hive在Hadoop上; Mysql 將數(shù)據(jù)存儲(chǔ)在設(shè)備或本地系統(tǒng)中;
- 2半夷、數(shù)據(jù)更新: Hive不支持?jǐn)?shù)據(jù)的改寫和添加婆廊,是在加載的時(shí)候就已經(jīng)確定好了;數(shù)據(jù)庫可以CRUD;
- 3、索引: Hive無索引玻熙,每次掃描所有數(shù)據(jù)否彩,底層是MR,并行計(jì)算, 適用于大數(shù)據(jù)量; MySQL有索引 , 適給在線查詢數(shù)據(jù);
- 4嗦随、執(zhí)行: Hive底層是MarReduce ; MySQL底層是執(zhí)行引擎;
- 5列荔、可擴(kuò)展性: Hive: 大數(shù)據(jù)量; MySQL: 相對(duì)就很少了。
- 6枚尼、Hive不支持事務(wù)
1贴浙、hive不支持將數(shù)據(jù)插入現(xiàn)有的表或分區(qū),僅支持覆蓋重寫整張表
- hive sql沒有update署恍、insert into類的更新表或插入表的操作
- 關(guān)于這個(gè)很多人都寫了不支持崎溃,但是在Hive的之前版本已經(jīng)新增了這幾個(gè)命令,現(xiàn)在是可以使用的
2盯质、hive sql特殊字符拼接問題袁串,如分號(hào)要先進(jìn)行八進(jìn)制的ASCII碼轉(zhuǎn)義。
- 不能智能識(shí)別concat(‘;’,key)呼巷,只會(huì)將 ‘ 囱修;’ 當(dāng)做SQL結(jié)束符號(hào)。
MySQL:
select concat(key,concat(';',key)) from dual;
hivesql:
select concat(key,concat('\073',key)) from dual;
將分號(hào)的用其八進(jìn)制的ASCII碼進(jìn)行轉(zhuǎn)義
3王悍、hive sql不支持非等值連接破镰,sql支持非等值連接
hive中把不相等的情況拿出來時(shí),無法直接寫字段A<>字段B压储,否則會(huì)報(bào)錯(cuò)鲜漩。
想從一個(gè)訂單表中,剔除測(cè)試用戶的訂單集惋,該如何實(shí)現(xiàn)呢孕似?使用left join
select a.uid,a.orderid
from table1 a --訂單表
left join table2 b --測(cè)試用戶id表
on a.uid = b.uid
where b.uid is null
4、Hive中關(guān)于null 的存儲(chǔ)與SQL不同:
在傳統(tǒng)數(shù)據(jù)庫中字段沒有值或者為空即表示為NULL刮刑,但是在hive中默認(rèn)的NULL值是\N鳞青。
在hive中會(huì)把文本的\N解析為NULL。在使用IS NULL 或者IS NOT NULL時(shí)會(huì)過濾數(shù)據(jù)为朋。
如果想延續(xù)傳統(tǒng)數(shù)據(jù)庫中對(duì)于空值為NULL臂拓,可以通過alter語句來修改hive表的信息,保證解析時(shí)是按照空值來解析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
- 時(shí)間轉(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)建表時(shí)津函,一般會(huì)根據(jù)導(dǎo)入的數(shù)據(jù)格式來指定字段分隔符和列分隔符。
一般導(dǎo)入的文本數(shù)據(jù)字段分隔符多為逗號(hào)分隔符或者制表符(但是實(shí)際開發(fā)中一般不用著這種容易在文本內(nèi)容中出現(xiàn)的的符號(hào)作為分隔符)孤页,當(dāng)然也有一些別的分隔符尔苦,也可以自定義分隔符。有時(shí)候也會(huì)使用hive默認(rèn)的分隔符來存儲(chǔ)數(shù)據(jù)行施。
分隔符詳解:https://blog.csdn.net/qq_26442553/article/details/80297028