Hive與SQL的區別

1、 建表語句不一樣,hive有列分割,按字段分割,sql沒有

hive中在創建表時,一般會根據導入的數據格式來指定字段分隔符和列分隔符。
一般導入的文本數據字段分隔符多爲逗號分隔符或者製表符(但是實際開發中一般不用着這種容易在文本內容中出現的的符號作爲分隔符),當然也有一些別的分隔符,也可以自定義分隔符。有時候也會使用hive默認的分隔符來存儲數據。

分隔符詳解:https://blog.csdn.net/qq_26442553/article/details/80297028

2、 hive 不支持非等值連接,sql支持非等值連接

hive中把不相等的情況拿出來時,無法直接寫字段A<>字段B,否則會報錯。

想從一個訂單表中,剔除測試用戶的訂單,該如何實現呢?使用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

3、 hive 不支持非等值連接,sql支持非等值連接

比如 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;

4、 hive中關於null 的存儲與SQL不同

在傳統數據庫中字段沒有值或者爲空即表示爲NULL,但是在hive中默認的NULL值是\N。
在hive中會把文本的\N解析爲NULL。在使用IS NULL 或者IS NOT NULL時會過濾數據。
如果想延續傳統數據庫中對於空值爲NULL,可以通過alter語句來修改hive表的信息,保證解析時是按照空值來解析NULL值。語句如下:

alter table ljn005 
SETSERDEPROPERTIES('serialization.null.format' ='');

這樣就可以修改默認的NULL值的定義了。比如這裏定義

alter table ljn005
SETSERDEPROPERTIES('serialization.null.format' ='abc'); 

則以後出現’abc’,hive都會把這個解析爲NULL值。

5、分號字符

分號是SQL語句結束標記,在HiveQL中也是,但是在HiveQL中,對分號的識別沒有那麼智慧,例如:

select concat(key,concat(';',key)) from dual;

但HiveQL在解析語句時提示:

 FAILED: Parse Error: line 0:-1 mismatched input '<EOF>' expecting ) in function specification

解決的辦法是,使用分號的八進制的ASCII碼進行轉義,那麼上述語句應寫成:

select concat(key,concat('\073',key)) from dual;

6、hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操作

關於這個很多人都寫了不支持,但是在Hive的之前版本已經新增了這幾個命令,現在是可以使用的

7、hive支持將轉換後的數據直接寫入不同的表,還能寫入分區、hdfs和本地目錄; SQL落地到文件

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