[Hive]Hive使用指南七 空值与NULL

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/78276551 1.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/78276551

1. NULL(null)值

创建一个临时表tmp_null_empty_test,并插入一些NULL数据:

CREATE  TABLE IF NOT EXISTS tmp_null_empty_test(
  uid string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

INSERT OVERWRITE TABLE tmp_null_empty_test select NULL from test WHERE dt = '20171016';

我们看一下从Hive中取出来的数据:

hive> select * from tmp_null_empty_test;
OK
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
...

我们再看一下这张表在HDFS上究竟是如何存储的?

hadoop fs -text /user/hive/warehouse/test.db/tmp_null_empty_test/* | less
\N
\N
\N
\N
\N
\N
\N
\N
\N
\N
\N
...

发现Hive将NULL值存储为'\N'。

Hive在底层数据中如何保存和标识NULL,是由serialization.null.format参数控制的,默认为serialization.null.format'='\\N。我们可以更改这一参数使之NULL值存储为其他形式,例如下面我们更改为"null":

ALTER TABLE tmp_null_empty_test SET SERDEPROPERTIES('serialization.null.format' = 'null');

我们删除数据重新倒入一遍数据:

hadoop fs -text /user/hive/warehouse/test.db/tmp_null_empty_test/* |less
null
null
null
null
null
null
null
null
null
...

这样的设计存在一个问题是如果实际想存储'\N',那么实际查询出来的也是NULL而不是'\N' 。所以如果真的想存储'\N'时,可以更改配置参数为其他格式即可。

那我们在Hive中如何查询等于'NULL'的那些值呢?可以使用如下命令查询:

hive> select * from tmp_null_empty_test where uid is null;
OK
NULL
NULL
NULL
NULL
NULL
...

2. 空字符串

我们再看一下存储空字符串的情况,删除之前的数据,重新导入一些空字符串:

INSERT OVERWRITE TABLE tmp_null_empty_test select "" from test WHERE dt = '20171016';

我们看一下从Hive中取出来的数据:

hive> select * from tmp_null_empty_test;
OK

...

Time taken: 0.047 seconds, Fetched: 36 row(s)

我们再看一下在HDFS上究竟是如何存储的?

hadoop fs -text /user/hive/warehouse/test.db/tmp_null_empty_test/* |less

...

对于空字符串我们使用如下命令查询:

hive> select count(*) from tmp_null_empty_test where uid = "";
OK
36

但是不能使用is null来判断:

hive> select count(*) from tmp_null_empty_test where uid is null;
OK
0

3. 数据类型与NULL

INT与STRING的存储,NULL默认的存储都是'\N'。如果数据类型为String的数据为"",存储才是""。如果往Int类型的字段插入""数据,存储为'\N'。 查询的时候,对于Int类型数据可以使用IS NULL来判断NULL值;对于String数据类型的数据采用IS NULL来查询NULL值,采用=""来查询空字符串。

我们遇到的一个Case,在查询String数据类型uid缺失的数据时,我们不得不使用IS NULL=""两个判断条件进行过滤,我们其实想遵循SQL规范使用IS NULL一个判断条件判断即可,但是在Hive中与传统的数据库又不一样,在于NULL的解读不同。如果想延续传统数据库中对于空值为NULL,可以通过alter语句来修改hive表的信息,保证解析时是按照空值来解析NULL值:

ALTER TABLE tmp_null_empty_test SET SERDEPROPERTIES('serialization.null.format' = '');

Example:

hive> INSERT OVERWRITE TABLE tmp_null_empty_test select "" from test WHERE dt = '20171016';
hive> select count(*) from tmp_null_empty_test where uid is null;
OK
36

备注:

Hive版本为2.1.1
目录
相关文章
|
4月前
|
SQL NoSQL 数据库
Flutter Hive NoSql 数据库使用指南
本文将会写一个 Hive CURD 的例子,详细介绍 Hive 这个轻量级的 Flutter 离线数据库的使用方法,包括 Hive 在 Flutter 开发中的重要性、Hive 与 SQLite 的比较等,帮助开发者快速上手 Hive 数据库。
Flutter Hive NoSql 数据库使用指南
|
6月前
|
SQL 关系型数据库 MySQL
python在mysql中插入或者更新null空值
这段代码是Python操作MySQL数据库的示例。它执行SQL查询从表`a_kuakao_school`中选取`id`,`university_id`和`grade`,当`university_id`大于0时按升序排列。然后遍历结果,根据`row[4]`的值决定`grade`是否为`NULL`。若不为空,`grade`被格式化为字符串;否则,设为`NULL`。接着构造UPDATE语句更新`university`表中对应`id`的`grade`值,并提交事务。重要的是,字符串`NULL`不应加引号,否则更新会失败。
152 2
|
3月前
|
SQL 关系型数据库 MySQL
mysql不等于<>取特定值反向条件的时候字段有null值或空值读取不到数据
对于数据库开发的专业人士来说,理解NULL的特性并知道如何正确地在查询中处理它们是非常重要的。以上所介绍的技巧和实例可以帮助你更精准地执行数据库查询,并确保数据的完整性和准确性。在编写代码和设计数据库结构时,牢记这些细节将有助于你避免许多常见的错误,提高数据库应用的质量与性能。
119 0
|
5月前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之启用hive兼容的时候,某个字段是null,是否会把这个字段当成空白连起来
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
Java
java servlet 文件上传 req.getPart null 返回空值
java servlet 文件上传 req.getPart null 返回空值
139 0
|
存储 关系型数据库 MySQL
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
一篇短文让你明白MySQL数据库的表中 NULL 和 空值之间的区别!
4931 0
MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?
|
SQL JSON 分布式计算
hive get_json_object解析json结果为null咋办?
解决get_json_object解析json结果为null的问题
602 0
|
6月前
|
SQL 前端开发 关系型数据库
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
128 0
|
SQL HIVE
Hive操作超时错误:Session 0x0 for server null
Hive操作超时错误:Session 0x0 for server null
81 1
|
SQL 文件存储 数据库
Hive分区表的新增字段数据为null的问题解决方法
Hive分区表的新增字段数据为null的问题解决方法
342 0