HiveSQL 與 SQL 的區(qū)別

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容