hive中的NULL分析

2021-06-26 09:24:35 字數 1553 閱讀 9248

hive中有種假null,它看起來和null一摸一樣,但是實際卻不是null。空值null在底層預設是用'\n'來儲存的,hive中'\'是轉義字元,需要對'\'進行一次轉義,所以變成'\\n'。

如果實際想儲存'\n',那麼實際查詢出來的也是null而不是'\n'。

修改預設的null表示:

alter table test set serdeproperties('serialization.null.format' = 'a');

hive的使用中不可避免對null、『』的判斷識別。但是hive區別與傳統的資料庫。下面一一說明

1、資料型別。

int與string的儲存。null預設的儲存都是\n。 string的資料如果為""。儲存才是""。另外往int型別的字段插入資料「」.結果還是\n

[hadoop@nn1 ~]$ hadoop fs -cat /user/hive/warehouse/aaa.db/dual2/*

warning: $hadoop_home is deprecated.

1aaa

\nbbb

3\n3

42。查詢的時候。對於int就是可以使用is null。

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

select b.id,b.name,a.id

from

dual2 b

left outer join 

dual a

on (a.id=b.id)

where b.name ='';

結果:3               null

4               null

select b.id,b.name,a.id

from

dual2 b

left outer join 

dual a

on (a.id=b.id)

where b.name is null;

結果:3       null    null

可以看出:判斷是根據實際的儲存判斷所得出。

因此,在開發過程中如果需要對空進行判斷,一定得知道儲存的是哪種資料。

附判斷例子:

select if(t.userid is null,k.userid,t.userid) as userid, if(t.vodtime is null,0,t.vodtime) as vodtime, if(k.seriestime is null,0,k.seriestime) as seriestime from

(select userid, round(sum(allseconds)/3600,3) as vodtime from vodview where num = -1 group by userid ) t full join 

(select userid, round(sum(allseconds)/3600,3) as seriestime from vodview where num <> -1 group by userid) k

on t.userid = k.userid

hive 中的NULL測試

hive 中的null測試 這個文章和我要表達的意思基本一樣。alter table test123 set serdeproperties serialization.null.format 這個語句會把hive中null的底層儲存改變 在未指定以上語句時候 string 型別的null 和int...

Hive中的一種假NULL

hive中有種假null,它看起來和null一摸一樣,但是實際卻不是null。例如如下這個查詢 hive desc ljn004 oka string time taken 0.237 seconds hive select a from ljn004 oknull time taken 46.23...

Hive 記null帶來的坑

在hive或者impala中,null值表示這個字段值為空值 沒有值 一般情況下我們把資料從原始系統抽取到數倉ods層的時候,都要做空值處理,比方說用nvl 函式把空值置為0或者空字串等等,如果不處理,後續可能給開發帶來坑。下面以乙個具體的例子說明筆者在開發的時候,由於疏忽大意,沒對空值進行處理,導...