【Hive】空值NULL与空字符串‘’

一、关于NULL与‘’的使用区别

SELECT    *    FROM    table2

【Hive】空值NULL与空字符串‘’_第1张图片

此时需求为查询list为空的记录,统计数量

SELECT
	COUNT( *)
FROM
	(
		SELECT
			*
		FROM
			table2
		WHERE
			list <> ''  -- 2149190
			--list IS NOT NULL --2149190
			-- list is null  -- 1583579
			-- list = '' -- 0
	)

发现 list is null ,有 1583579 条; list = '' 只有 0 条。

hive里面的 null(空值) 和 ''(空字符串) 是两个不同的东西。

在hive的数据中,null值(空值)较为常见,比如字段没有值,就是所谓的null值(空值),而 ''(空字符串)多为人为给定的,不多见。(

'' 与 length(xx)=0

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

 

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

int与string类型数据存储,null默认存储为 \N;

string类型的数据如果为"",存储则是"";

另外往int类型的字段插入数据“”时,结果还是\N。

 

(2)不同数据类型,空值的查询

对于int可以使用is null来判断空;

而对于string类型,条件is null 查出来的是\N的数据;而条件 =’’,查询出来的是""的数据。

二、当有值的时候,<>与=的使用

SELECT
	id, cid, name
FROM
    table1

【Hive】空值NULL与空字符串‘’_第2张图片

SELECT
	id, cid, name
FROM
    table1
WHERE
    cid <> '113'

 【Hive】空值NULL与空字符串‘’_第3张图片

SELECT
	id, cid, name
FROM
    table1
WHERE
    cid = '113'

 

三、hive的NULL有时候是必须的

1)hive中insert语句必须列数匹配,不支持不写入,没有值的列必须使用null占位

2)hive表的数据文件中按分隔符区分各个列。空列会保存NULL(\n)来保留列位置。但外部表加载某些数据时如果列不够,如表13列,文件数据只有2列,则在表查询时表中的末尾剩余列无数据对应,自动显示为NULL。

所以,NULL转化为空字符串,可以节省磁盘空间,实现方法有几种:
    1)建表时直接指定(两种方式):
        a、用语句

ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
    with serdeproperties('serialization.null.format' = '')

实现,注意两者必须一起使用,如

   CREATE TABLE hive_tb (id int,name STRING)
   PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
   ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
   WITH SERDEPROPERTIES (
        ‘field.delim’='/t’,
        ‘escape.delim’='//’,
        ‘serialization.null.format'=''
   ) STORED AS TEXTFILE;

b、或者通过ROW FORMAT DELIMITED NULL DEFINED AS '' 如

   CREATE TABLE hive_tb (id int,name STRING)
   PARTITIONED BY ( `day` string,`type` tinyint COMMENT '0 as bid, 1 as win, 2 as ck', `hour` tinyint)
   ROW FORMAT DELIMITED 
        NULL DEFINED AS '' 
   STORED AS TEXTFILE;

2)修改已存在的表:

    alter table hive_tb set serdeproperties('serialization.null.format' = '');
节省空间的验证结果如下:
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
    1137
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
    319753
    -----------------------------------
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=00/0*
    885
    hadoop fs -du /hivedata/warehouse/pmp.db/hive_tb/day=2016-05-14/type=1/hour=01/0*
    249529

四、【字段】null值处理——NVL、Coalesce函数

1、NVL函数

NVL函数的格式如下:NVL(expr1,expr2)
含义是:如果第一个参数为null(空值)那么显示第二个参数的值,如果第一个参数的值不为null(空值),则显示第一个参数本来的值。

select nvl(null,3);    -- 结果:3
 
select nvl('',3);      -- 结果:''   (注意:在hive中展示位1,但实际为'',可用select nvl('',3)='';验证)

2、Coalesce函数

Coalese函数格式如下:Coalesce(expr1, expr2, expr3….. exprn)

Coalese函数的作用和NVL函数有点相似,其优势是有更多的选项
表示可以指定多个表达式的占位符。所有表达式必须是相同类型,或者可以隐性转换为相同的类型。

作用是:返回表达式中第一个非空表达式。

SELECT COALESCE(NULL,null,3,4,5);   -- 结果为:3
 
SELECT COALESCE(NULL,null,'',3,4,5);   -- 结果为:''
 
SELECT COALESCE(NULL,null,null,NULL);  -- 结果为:null

如果所有自变量均为 NULL,则 COALESCE 返回 NULL。

【Hive】空值NULL与空字符串‘’_第4张图片


参考:

深入解析hive中的NULL(空值)和''(空字符串) 

你可能感兴趣的:(Hive,&,Sql,&,Spark)