关于Hive中的NULL

最近公司的小伙伴基本上都在用Hive来查询数据,毕竟对于后端程序员来讲更为熟悉的还是像MySQL,Oracle这样的数据库,虽然Hive中的SQL标准和上面两者很相似了,但是还有些差别的,这也造成了同事们的水土不服,其中就有关于Hive判空的操作,那这里就记录一下Hive的Null

hive的使用中对null、‘’(空字符串)进行判断识别

  1. 不同数据类型对空值的存储规则
    • int与string类型数据存储,null默认存储为 \N;
    • string类型的数据如果为””,存储则是””;
    • 另外往int类型的字段插入数据“”时,结果还是\N。
  1. 不同数据类型,空值的查询
    • 对于int可以使用is null来判断空;
    • 而对于string类型,条件is null 查出来的是\N的数据;而条件 =’’,查询出来的是””的数据。

下面举例来说明:
截屏2020-11-19 上午12.13.16.png
上图 t_user_details,brent用户的register_date字段为NULL值,那这时候,我们应该怎样去根据register_date字段值去查询brent这个用户呢?

直接看结果:
截屏2020-11-19 上午12.17.02.png
对于上面的查询,register_date = ‘’ 是不能成功过滤的。根据上面所说的,也就是 对于string类型,条件is null 查出来的是\N的数据;而条件 =’’,查询出来的是””的数据

所以对于 cloumn = ‘’ 的查询,是针对这个cloumn字段,写入值的时候,是 ‘’ 空子串,所以此时,is null 的条件则不生效

现在我们去HDFS底层存储中去求证一下
截屏2020-11-19 上午12.21.26.png

有图有真相,hive 中null实际在HDFS中默认存储为 \N

可以使用serialization.null.format来指定Hive中保存和标识NULL,可以设置为默认的\N,也可以为NULL或’’

eg : ALTER TABLE b SET SERDEPROPERTIES (‘serialization.null.format’=’’);

如果表中存在大量的NULL值,则在Hive的数据文件中会产生大量的\N数据,浪费存储空间,那我们可以将serialization.null.format设置为’’

那么对于上游系统写入的数据不清楚的情况下,我们怎么去方便的对空值进行判断呢?

给一个万金油的写法:

1
select * from t_user_details  where register_date is null or register_date  <> '';