HIVE踩坑 NULL和空字串處理

2021-09-23 18:48:14 字數 3010 閱讀 9196

這裡我們針對在hive中遇到的null和空字串問題進行簡單**,避免踩坑!!!

簡單探索

首先新建一張測試表test_01,用作後續測試。

create

table

ifnot

exists

`test_01`

(`id`

int,

`name` string,

`age`

int,

`score`

float

)row format delimited fields

terminated

by',' stored as textfile;

新增簡單的幾條測試資料,具體如下

insert overwrite  table test_01

select

null

,null,10

,95union

allselect2,

'',10,

95union

allselect3,

'lucy',15

,null

union

allselect4,

'jack',15

,100

;

檢視新增資料

hive (tmp)

>

select

*from test_01;

oknull

null

1095.0210

95.0

3 lucy 15

null

4 jack 15

100.0

底層hdfs檔案預設儲存格式

[root@nd2 wh]

# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0

\n,\n,10,95.0

2,,10,95.0

3,lucy,15,\n

4,jack,15,100.0

得出結論:

預設情況下,string型別的資料如果為" 「,底層hdfs檔案預設儲存則是」 ";

int與string等型別的資料如果為null,底層hdfs預設預設儲存為 \n;

這裡我們根據name條件查詢

--條件為 name is null

hive (tmp)

>

select

*from test_01 where name is

null

;null

null

1095.0

--條件為name = ''

hive (tmp)

>

select

*from test_01 where name ='';

21095.0

--條件為id is null

hive (tmp)

>

select

*from test_01 where id is

null

;null

null

1095.0

可以得出結論:

預設情況下,對於int可以使用is null來判斷空;

而對於string型別,條件is null 查出來的是\n的資料;而條件 =" 「,查詢出來的是」 "的資料。

實際情況

在hive使用中,很多時候我們可能需要使用底層hdfs檔案用作資料儲存或其它資料遷移,備份。這個時候底層hdfs檔案中\n和" "處理就顯得很重要了(不同的應用可能對底層檔案處理不一樣)。

在hive中,一般我們會在新建表之後執行

--自定義底層用什麼字元來表示null。這裡用''來表示。換句話說就是讓null和''等價,底層hdfs讓null不顯示。

alter

table test_01 set serdeproperties (

'serialization.null.format'=''

);

我們重新插入資料,查詢結果

hive (tmp)

>

select

*from test_01;

oknull

null

1095.0

2null

1095.0

3 lucy 15

null

4 jack 15

100.0

底層hdfs檔案儲存的資料格式為

[root@nd2 wh]

# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0

,,10,95.0

2,,10,95.0

3,lucy,15,

4,jack,15,100.0

我們發現底層資料儲存的是" ",通過查詢顯示的結果時null。

注意:我們使用is null或者 = " 「都是根據查詢顯示的結果進行過濾。而不是根據底層檔案格式。

查詢空值用is null,如果用=」 ",查詢不到資料。

--條件為 name is null

hive (tmp)

>

select

*from test_01 where name is

null

;null

null

1095.0

2null

1095.0

--條件為 name =''

hive (tmp)

>

select

*from test_01 where name ='';

oktime taken: 4.058 seconds

空字元與空格字元 NULL 空字串

在許多的程式語言內,空字串的標記為兩個雙引號 而null又有以下理解 1.字面理解,null就是無效的 無價值的 2.在程式設計中,變數以null結尾,表示其後沒有可用的資料,資料讀取在此結束。3.null在資料庫中表示不知道 unknown 的資料,主要有3種意思 a 知道資料存在,但不知道具體值...

NULL字串和空字串的區別

乙個null字串就是使用qstring的預設建構函式或者使用 const char 0 作為引數的建構函式建立的qstring字串物件 而乙個空字串是乙個大小為0的字串。乙個null字串一定是乙個空字串,而乙個空字串未必是乙個null字串,例如 qstring isnull 結果為true qstr...

NULL 和空字串 的區別

null和空字串的區別 1,null不指向任何物件,相當於沒有任何值 而 代表乙個長度為0的字串 2,null不分配記憶體空間 而 會分配記憶體空間 例子 string str null 定義可空型別變數 str str 使用合併運算子 console.writeline str 1000 cons...