hive中的null
  1. Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL。

    create table test_null(
    word string
    )
    row format delimited fields terminated by '\t'
  2. 写入'\N'

    insert overwrite table test_null select '\\N';
  3. 查询

    hive (default)> select * from test_null;
    OK
    test_null.word
    NULL

    这种假NULL产生的原因实际上源于对表的错误操作。在Hive中,空值NULL在底层默认是用'\N'来存储的

  4. 看一下底层的数据存储

    [root@aliyun ~]# hdfs dfs -cat hdfs://aliyun:9000/user/hive/warehouse/test_null/000000_0
    \N

    这样的设计存在一个问题是如果实际想存储'\N',那么实际查询出来的也是NULL而不是'\N'

  5. 修改NULL的默认存储字符

    hive> alter table test_null SET SERDEPROPERTIES('serialization.null.format' = 'a');
  6. 插入一个NULL

    insert overwrite table test_null select NULL;
  7. 看一下修改后的底层的数据存储

    [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,在开发过程中一定要注意!

Author: Tunan
Link: http://yerias.github.io/2021/07/18/hive/39/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.