最近公司的小伙伴基本上都在用Hive来查询数据,毕竟对于后端程序员来讲更为熟悉的还是像MySQL,Oracle这样的数据库,虽然Hive中的SQL标准和上面两者很相似了,但是还有些差别的,这也造成了同事们的水土不服,其中就有关于Hive判空的操作,那这里就记录一下Hive的Null
hive的使用中对null、‘’(空字符串)进行判断识别
- 不同数据类型对空值的存储规则
- int与string类型数据存储,null默认存储为 \N;
- string类型的数据如果为””,存储则是””;
- 另外往int类型的字段插入数据“”时,结果还是\N。
- 不同数据类型,空值的查询
- 对于int可以使用is null来判断空;
- 而对于string类型,条件is null 查出来的是\N的数据;而条件 =’’,查询出来的是””的数据。
下面举例来说明:
上图 t_user_details,brent用户的register_date字段为NULL值,那这时候,我们应该怎样去根据register_date字段值去查询brent这个用户呢?
直接看结果:
对于上面的查询,register_date = ‘’ 是不能成功过滤的。根据上面所说的,也就是 对于string类型,条件is null 查出来的是\N的数据;而条件 =’’,查询出来的是””的数据
所以对于 cloumn = ‘’ 的查询,是针对这个cloumn字段,写入值的时候,是 ‘’ 空子串,所以此时,is null 的条件则不生效。
现在我们去HDFS底层存储中去求证一下
有图有真相,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 <> ''; |