HIVE踩坑——NULL和空字符串处理

Posted lxx666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HIVE踩坑——NULL和空字符串处理相关的知识,希望对你有一定的参考价值。

这里我们针对在HIVE中遇到的NULL和空字符串问题进行简单探讨,避免踩坑!!!

简单探索

首先新建一张测试表test_01,用作后续测试

CREATE  TABLE IF NOT EXISTS `test_01`(
  `id` INT, `name` STRING,`age` INT, `score` FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;

新增简单的几条测试数据,具体如下

 insert overwrite  table test_01
  select NULL,NULL,10,95
  union all select 2 ,‘‘,10,95
  union all select 3 ,Lucy,15,NULL
  union all select 4,Jack,15,100;

查看新增数据

hive (tmp)> select * from test_01;
OK
NULL    NULL    10    95.0
2                10    95.0
3        Lucy    15    NULL
4        Jack    15    100.0

底层HDFS文件默认存储格式

[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0
N,N,10,95.0
2,,10,95.0
3,Lucy,15,N
4,Jack,15,100.0

得出结论:
默认情况下,STRING类型的数据如果为" “,底层HDFS文件默认存储则是” ";
INT与STRING等类型的数据如果为NULL,底层HDFS默认默认存储为 N;

这里我们根据name条件查询

--条件为 name is null
hive (tmp)> select * from test_01 where name is null;
NULL    NULL    10    95.0
--条件为name = ‘‘
hive (tmp)> select * from test_01 where name = ‘‘;
2        10    95.0
--条件为id is null
hive (tmp)> select * from test_01 where id is null;
NULL    NULL    10    95.0

可以得出结论:
默认情况下,对于INT可以使用is null来判断空;
而对于STRING类型,条件is null 查出来的是N的数据;而条件 =" “,查询出来的是” "的数据。

实际情况

在HIVE使用中,很多时候我们可能需要使用底层HDFS文件用作数据存储或其它数据迁移,备份。这个时候底层HDFS文件中N和" "处理就显得很重要了(不同的应用可能对底层文件处理不一样)。
在HIVE中,一般我们会在新建表之后执行

--自定义底层用什么字符来表示NULL。这里用‘‘来表示。换句话说就是让null和‘‘等价,底层HDFS让null不显示。
ALTER TABLE test_01 SET SERDEPROPERTIES (serialization.null.format=‘‘);

我们重新插入数据,查询结果

hive (tmp)> select * from test_01;
OK
NULL    NULL    10    95.0
2        NULL    10    95.0
3        Lucy    15    NULL
4        Jack    15    100.0

底层HDFS文件存储的数据格式为

[root@nd2 wh]# hadoop fs -cat /user/hive/warehouse/tmp.db/test_01/000000_0
,,10,95.0
2,,10,95.0
3,Lucy,15,
4,Jack,15,100.0

我们发现底层数据保存的是" ",通过查询显示的结果时NULL。
注意:
我们使用is null或者 = " “都是根据查询显示的结果进行过滤。而不是根据底层文件格式。
查询空值用is null,如果用=” ",查询不到数据。

--条件为 name is null
hive (tmp)> select * from test_01 where name is null;
NULL    NULL    10    95.0
2    NULL    10    95.0
--条件为 name =‘‘
hive (tmp)> select * from test_01 where name =‘‘;
OK
Time taken: 4.058 seconds

 

原文链接:https://blog.csdn.net/henrrywan/java/article/details/90612378

以上是关于HIVE踩坑——NULL和空字符串处理的主要内容,如果未能解决你的问题,请参考以下文章

HIVE 外部表 - 将空字符串设置为 NULL

HIVE-null值不计数量,空字符串计数量

sparksql写入表中,bigint类型显示null

hive 踩坑 get_json_object 返回NULL或部分可解析部分解析不了

Kafka踩坑记录

HTTP转换为null什么意思?