标签:通过 min 条件查询 串处理 term ati log pre name
这里我们针对在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
标签:通过 min 条件查询 串处理 term ati log pre name
原文地址:https://www.cnblogs.com/lxx666/p/12769527.html