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或者空字串等等,如果不處理,後續可能給開發帶來坑。下面以乙個具體的例子說明筆者在開發的時候,由於疏忽大意,沒對空值進行處理,導...