Hive 使用者指南 v1.0(繁体)

2026/1/27 19:28:20

8. 使用HIVE注意點

8.1 字元集

Hadoop和Hive都是用UTF-8編碼的,所以, 所有中文必頇是UTF-8編碼, 才能正常使用 備註:中文資料load到表裡面, 如果字元集不同,很有可能全是亂碼需要做轉碼的, 但是hive本身沒有函數來做這個

8.2 壓縮

hive.exec.compress.output 這個參數, 默認是 false,但是很多時候貌似要單獨顯式設置一遍

否則會對結果做壓縮的,如果你的這個檔後面還要在hadoop下直接操作, 那麼就不能壓縮了

8.3 count(distinct)

當前的 Hive 不支持在一條查詢語句中有多 Distinct。如果要在 Hive 查詢語句中實現多Distinct,需要使用至少 n+1 條查詢語句(n為distinct的數目),前 n 條查詢分 別對 n 個列去重,最後一條查詢語句對 n 個去重之後的列做 Join 操作,得到最終結果。

8.4 JOIN

只支援等值連接

45

8.5 DML操作

只支援INSERT/LOAD操作,無UPDATE和DELTE

8.6 HAVING

不支援HAVING操作。如果需要這個功能要嵌套一個子查詢用where限制

8.7 子查詢

Hive不支持where子句中的子查詢

8.8 Join中處理null值的語義區別

SQL標準中,任何對null的操作(數值比較,字串操作等)結果都為null。Hive對null值處理的邏輯和標準基本一致,除了Join時的特殊邏輯。

這裡的特殊邏輯指的是,Hive的Join中,作為Join key的欄位比較,null=null是有意義的,且返回值為true。檢查以下查詢: select u.uid, count(u.uid) from t_weblog l join t_user u on (l.uid = u.uid) group by u.uid; 查詢中,t_weblog表中uid為空的記錄將和t_user表中uid為空的記錄做連接,即l.uid

= u.uid=null成立。

如果需要與標準一致的語義,我們需要改寫查詢手動過濾null值的情況:

select u.uid, count(u.uid) from t_weblog l join t_user u on (l.uid = u.uid and l.uid is not null and u.uid is not null) group by u.uid; 實踐中,這一語義區別也是經常導致資料傾斜的原因之一。

8.9 分號字元

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

慧,例如:

select concat(cookie_id,concat(';',’zoo’)) from c02_clickstat_fatdt1 limit 2;

FAILED: Parse Error: line 0:-1 cannot recognize input '' in function specification

46

可以推斷,Hive解析語句的時候,只要遇到分號就認為語句結束,而無論是否用引號包含起來。

解決的辦法是,使用分號的八進制的ASCII碼進行轉義,那麼上述語句應寫成: select concat(cookie_id,concat('\\073','zoo')) from c02_clickstat_fatdt1 limit 2; 為什麼是八進制ASCII碼?

我嘗詴用十六進位的ASCII碼,但Hive會將其視為字串處理並未轉義,好像僅支援八進制,原因不詳。這個規則也適用於其他非SELECT語句,如CREATE TABLE中需要定義分隔符號,那麼對不可見字元做分隔符號就需要用八進制的ASCII碼來轉義。

8.10 Insert 8.10.1 新增數據

根據語法Insert必頇加“OVERWRITE”關鍵字,也就是說每一次插入都是一次重寫。那如何實現表中新增資料呢?

假設Hive中有表xiaojun1, hive> DESCRIBE xiaojun1; OK id int value int

hive> SELECT * FROM xiaojun1; OK 3 4 1 2 2 3

現增加一條記錄:

hive> INSERT OVERWRITE TABLE xiaojun1

47

SELECT id, value FROM (

SELECT id, value FROM xiaojun1 UNION ALL

SELECT 4 AS id, 5 AS value FROM xiaojun1 limit 1 ) u; 結果是:

hive>SELECT * FROM p1; OK 3 4 4 5 2 3 1 2

其中的關鍵在於, 關鍵字UNION ALL的應用, 即將原有資料集和新增資料集進行結合, 然後重寫表.

8.10.2 插入次序

INSERT OVERWRITE TABLE在插入資料時,是按照後面的SELECT語句中的欄位順序插入的. 也就說, 當id 和value 的位置互換, 那麼value將被寫入id, 同id被寫入value.

8.10.3 初始值

INSERT OVERWRITE TABLE在插入資料時, 後面的欄位的初始值應注意與表定義中的一致性. 例如, 當為一個STRING類型欄位初始為NULL時:

NULL AS field_name // 這可能會被提示定義類型為STRING, 但這裡是void CAST(NULL AS STRING) AS field_name // 這樣是正確的

48


Hive 使用者指南 v1.0(繁体).doc 将本文的Word文档下载到电脑
搜索更多关于: Hive 使用者指南 v1.0(繁体) 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219