Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL。
create table test_null(
word string
)
row format delimited fields terminated by '\t'写入
'\N'
insert overwrite table test_null select '\\N';
查询
hive (default)> select * from test_null;
OK
test_null.word
NULL这种假NULL产生的原因实际上源于对表的错误操作。在Hive中,空值NULL在底层默认是用
'\N'
来存储的看一下底层的数据存储
[root@aliyun ~]# hdfs dfs -cat hdfs://aliyun:9000/user/hive/warehouse/test_null/000000_0
\N这样的设计存在一个问题是如果实际想存储
'\N'
,那么实际查询出来的也是NULL而不是'\N'
。修改NULL的默认存储字符
hive> alter table test_null SET SERDEPROPERTIES('serialization.null.format' = 'a');
插入一个NULL
insert overwrite table test_null select NULL;
看一下修改后的底层的数据存储
[root@aliyun ~]# hdfs dfs -cat hdfs://aliyun:9000/user/hive/warehouse/test_null/000000_0
a其实上面说的这个假NULL出现的原因就是在默认情况下(即用
'\N'
表示NULL),插入了NULL值,然后又用SET SERDEPROPERTIES语句修改了存储NULL的字符串。'\N'
显示为NULL在Hive中是一个特例,于是就出现了这个假NULL,在开发过程中一定要注意!