详解:Hive中的NULL的处理、优点、使用情况(注意)

Hive中的NULL的处理、优点、使用情况

一:Hive中的NULL

hive的使用中不可避免的需要对null、‘’(空字符串)进行判断识别。但是hive又别于传统的数据库。
1.不同数据类型对空值的存储规则
int与string类型数据存储,null默认存储为 \N;

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

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

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

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

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

所以:
判断空时要根据实际的存储来进行判断。在开发过程中如果需要对空进行判断,一定得知道存储的是哪种数据。

二:Hive中的NULL的处理

建表时直接指定(两种方式)
1.用语句
ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’
with serdeproperties(‘serialization.null.format’ = ‘’)实现,
注意两者必须一起使用,

 create table adm.adm_crystal_plan_batch_order_7d_delta_daily(
    order_item_unit_price                    string,
    order_qty                                bigint,
    payment_amt                              bigint
    )
    partitioned by (dt string)
    row format delimited fields terminated by '31'
    stored as textfile
    tblproperties ( 'serialization.null.format' = '')
    ;

2.通过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;

补充:修改已存在的表

   alter table hive_tb set serdeproperties('serialization.null.format' = '');

这句话的意思是让null和’‘等价,也就是让null不显示,因为null对开发来说不好操作,可能不同地方代表意义不同,而且转码可能也会有问题,所有用’'代替。

三:Hive中的NULL的处理优点

HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N,
这样造成浪费大量空间。
可以看出存储NULL的\N 浪费了大量空间
使用以上的语句进行创建的时候,可以相互对比一下 数据量的大小空间
在hdfs上面对应的文件查询就可以看到结果

 hadoop fs -du

可以进行 节省空间结果的验证

四:Hive中的NULL的使用情况(注意)

但是不是所有的情况都需要进行是hive的null处理的

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

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

你可能感兴趣的:(优点,使用情况(注意))