hive中的空值處理

hive中的空值處理
用Sqoop往MySQL同步數據時,由於hdfs存儲的數據中有null值或’’,導致同步數據失敗。主要是hive sql中的空值造成的,所以今天就說一下怎麼解決這個問題。
一.hive中空值分兩種
(1)NULL
hive中null實際在HDFS中默認存儲爲’\N’,通過查詢顯示的是’NULL’。
這時如果查詢爲空值的字段可通過語句:aaa is null 或者 aaa =’\N’ 實現。
此時可用hive中與null有關的函數,如nvl,coalesce,is null等判斷是否爲null是爲true。產生NULL值,一般都是由hive外鏈接引起的。

(2)’'
‘’ 表示的是字段不爲null且爲空字符串,此時用 aaa is null 是無法查詢這種值的,必須通過 aaa ==’’
或者 length(aaa)=0 查詢,產生’‘值,一般都是源數據爲空。
在hive sql裏面已經加爲null判斷了。再看數據文件,發現其中的值不是通常的NULL,或者是\N,而是’’。
所以得到原因,用判斷null的nvl函數並不能排除’'的情況,需要用IF(aaa == ‘’,‘未知’,aaa) AS aaa 來判斷。

二.hive中空值NULL的處理方法
1.在hive中使用COALESCE進行空值處理
COALESCE是一個函數, (expression_1, expression_2, …,expression_n)依次參考各參數表達式,遇到非null值即停止並返回該值。如果所有的表達式都是空值,最終將返回一個空值。

比如我們要登記用戶的電話,數據庫中包含他的person_tel,home_tel,office_tel,我們只要取一個非空的就可以,則我們可以寫查詢語句

select COALESCE(person_tel,home_tel,office_tel) as contact_number from Contact;

select coalesce(a,b,c);
參數說明: 如果anull,則選擇b;如果bnull,則選擇c;
如果a!=null,則選擇a;如果a b c 都爲null ,則返回爲null

使用實例:
這個參數使用的場合爲:假如某個字段默認是null,你想其返回的不是null,而是比如0或其他值,可以使用這個函數

SELECT COALESCE(field_name,0) as value from table;

2.在hive中使用nvl進行空值處理
a.NVL函數
NVL函數的格式如下:NVL(expr1,expr2)
含義是:如果oracle第一個參數爲空那麼顯示第二個參數的值,如果第一個參數的值不爲空,則顯示第一個參數本來的值。

例如:
SQL> select ename,NVL(comm, -1) from emp;
 
ENAME NVL(COMM,-1)
------- ----
SMITH -1
ALLEN 300
WARD 500
JONES -1
MARTIN 1400
BLAKE -1
FORD -1
MILLER -1
其中顯示-1的本來的值全部都是空值的

b.NVL2函數
NVL2函數的格式如下:NVL2(expr1,expr2, expr3)
含義是:如果該函數的第一個參數爲空那麼顯示第二個參數的值,如果第一個參數的值不爲空,則顯示第三個參數的值。

例如:
SQL> select ename,NVL2(comm,-1,1) from emp;

ENAME NVL2(COMM,-1,1)
------- -----
SMITH 1
ALLEN -1
WARD -1
JONES 1
MARTIN -1
BLAKE 1
CLARK 1
SCOTT 1
上面的例子中。凡是結果是1的原來都不爲空,而結果是-1的原來的值就是空。

備註: 適用於數字型、字符型和日期型,但是 expr1和expr2的數據類型必須爲同類型

3.在hive中靈活運用 is null 和 is not null 進行null值過濾
Hive中有種假的NULL,它看起來和NULL一摸一樣,但是實際卻不是NULL。空值NULL在底層默認是用’\N’來存儲的,而我們習慣性對NULL 值的過濾,一般是is null 和 is not null。所以此時可以通過對修改hive 表的信息,來保證控制都顯示爲指定值 ,方便進行過濾。解決方法如下:
(1)如下:
alter table t_dw_ct_author set serdeproperties (‘serialization.null.format’ = ‘NULL’);
則出現:底層數據保存的是’NULL’,通過查詢顯示的是’NULL’
這時如果查詢爲空值的字段可通過 語句:a is null 或者 a=‘NULL’
或者
alter table t_dw_ct_author set serdeproperties(‘serialization.null.format’ = ‘\N’);
則出現:底層數據保存的是’\N’,通過查詢顯示的是’NULL’
這時如果查詢爲空值的字段可通過 語句:a is null 或者 a=’\N’
(2)’’ 與 length(xx)=0
‘’ 表示的是字段不爲null且爲空字符串,此時用 a is null 是無法查詢這種值的,必須通過 a=’’ 或者 length(a)=0 查詢

三.hive中空值’'的處理方法
1.IF(aaa == ‘’,‘未知’,aaa) 的用法
語法: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
返回值: T
說明: 當條件testCondition爲TRUE時,返回valueTrue;否則返回valueFalseOrNull

**實例:**if(條件表達式,結果1,結果2)相當於java中的三目運算符,只是if後面的表達式類型可以不一樣。

hive> select if(aaa == '','未知',aaa) fromlxw_dual;
    未知
發佈了86 篇原創文章 · 獲贊 17 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章