這裡我們針對在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...