Hive表NULL、空字符串判断和处理

 一、空值判断

       hive中空值基本分为NULL和空字符串''两种。

 (1)NULL 与 \N

       hive表中如何保存和标识NULL,可由 alter table name SET SERDEPROPERTIES('serialization.null.format' = '\N')控制。

(1) alter table name SET SERDEPROPERTIES('serialization.null.format' = '\N'); 
    则底层数据保存的是'\N',通过查询显示的是'NULL'
    这时如果查询为空值的字段可通过 语句:a is null 或者 a='\\N'
(2) alter tablename SET SERDEPROPERTIES('serialization.null.format' = 'NULL'); 
    则底层数据保存的是'NULL',通过查询显示的是'NULL'
    这时如果查询为空值的字段可通过 语句:a is null 或者 a='NULL'


 (2) ''与 length(xx)=0

       '' 表示的是字段不为null且为空字符串,此时用 a is null 是无法查询这种值的,必须通过 a='' 或者 length(a)=0 查询。

 二、空值处理

      hive的使用中不可避免的需要对null、''(空字符串)进行判断识别。但是hive有别于传统的关系型数据库。

(1)不同数据类型对空值的存储

   (a)int与string类型数据存储,null默认存储为\N。
   (b)string类型的数据如果为"",存储则是""。
   (c)往int类型的字段插入数据""时,结果还是\N。

(2)不同数据类型,空值的查询
   (a)对于int可以使用is null来判断空。
   (b)对于string类型,条件is null查出来的是\N的数据;而条件= '',查询出来的是""的数据。

三、例子

查询1:select b.id, b.name from b;
结果1:
1  lisi
2         
3  NULL

查询2:select b.id, b.name from b where b.name is null;
结果2:
3  NULL
 
查询3:select b.id, b.name from b where b.name='';
结果3:
2  

查询4:select b.id, b.name from b where b.name='' or b.name is null;
结果4:
2  
3   NULL

查询5:select b.id,b.name from b where b.name<>'' and b.name is not null;
结果5:
1  lisi

查询6:select b.id,b.name from b where length(b.name)<>0 and b.name is not null;
结果6:

1  lisi

总结: 判断空时要根据实际的存储来进行判断。在开发过程中如果需要对空进行判断,一定得知道存储的是哪种数据。在Hive中自定义指定字符来表示NULL,使用:ALTER TABLE b SET SERDEPROPERTIES ('serialization.null.format'='')。这样设置的目的是让null和''等价,也就是让null不显示,因为null对开发来说不好操作,可能不同地方代表意义不同,而且转码可能也会有问题,所有用''代替。

你可能感兴趣的:(Hive)