Hive中的一種假NULL

2021-06-18 23:50:32 字數 1799 閱讀 1493

hive中有種假null,它看起來和null一摸一樣,但是實際卻不是null。

例如如下這個查詢:

hive> desc ljn004;

oka

string

time taken: 0.237 seconds

hive> select a from ljn004;

oknull

time taken: 46.232 seconds

看上去好像ljn004的a欄位儲存了乙個 null,

但是換乙個查詢會發現它和null並不一樣:

hive> select a from ljn004 where a is null;

oktime taken: 62.56 seconds

來看一下實際儲存的是什麼:

hive> select * from ljn004;

ok\n

time taken: 1.232 seconds

hive> select a from ljn004 where a = '\\n';

oknull

time taken: 72.933 seconds

ljn004的a欄位實際儲存的是乙個'\n',a = '\\n'是因為hive中'\'是轉義字元,需要對'\'進行一次轉義,所以變成'\\n'。

這種假null產生的原因實際上源於對錶的錯誤操作。在hive中,空值null在底層預設是用'\n'來儲存的,看乙個例子:

hive> create table ljn005 (col1 string);

oktime taken: 1.258 seconds

1 rows loaded to ljn005

oktime taken: 63.727 seconds

hive> insert overwrite table ljn005 select null from dual;

然後看一下底層的資料儲存:

$ hadoop fs -cat /group/hive/ljn005/attempt_201205041518_256192_m_000000_0\n

可以看到底層資料將null儲存成了'\n' 。

這樣的設計存在乙個問題是如果實際想儲存'\n',那麼實際查詢出來的也是null而不是'\n' 。

hive給出一種並非完美的解決方法就是可以自定義底層用什麼字元來表示null。

例如我想用字元'a'來表示null:

hive> alter table ljn005 set serdeproperties('serialization.null.format' = 'a');

oktime taken: 0.175 seconds

hive> insert overwrite table ljn005 select null from dual;

1 rows loaded to ljn005

oktime taken: 62.66 seconds

再看一下底層的儲存:

$ hadoop fs -cat /group/hive/ljn005/attempt_201205041518_256764_m_000000_0a

這時候底層的儲存就變成了'a' ,今後插入到這張表中的'a'查詢出來就變成了null而不是'a' 。

其實上面說的這個假null出現的原因就是在預設情況下(即用'\n'表示null),插入了null值,然後又用set serdeproperties語句修改了儲存null的字串。這時候表的屬性修改了,但是底層儲存的檔案並沒有修改。而'\n'顯示為null在hive中又是乙個特例,於是就出現了這個假null,在開發過程中一定要注意!

hive中的NULL分析

hive中有種假null,它看起來和null一摸一樣,但是實際卻不是null。空值null在底層預設是用 n 來儲存的,hive中 是轉義字元,需要對 進行一次轉義,所以變成 n 如果實際想儲存 n 那麼實際查詢出來的也是null而不是 n 修改預設的null表示 alter table test ...

hive 中的NULL測試

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

dao注入失敗 null 的一種錯誤

初接觸springboot,沒有使用配置檔案來配置bean的掃瞄規則,出現了 autowired service可以自動注入,但是 autowired dao不能注入,導致dao報空指標。controller controller public class blacklistcontroller s...