首页  ·  知识 ·  大数据
hive中的NULL(hive空值处理)
网友  CSDN博客  实践应用  编辑:Ingrid   图片来源:网络
HIVE表中默认将NULL存为\N,可查看表的源文件(hadoopfs-cat或者hadoopfs-text),文件中存储大量\N

HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N,  

这样造成浪费大量空间。而且用java、python直接进入路径操作源数据时,解析也要注意。


另外,hive表的源文件中,默认列分隔符为\001(SOH),行分隔符为\n(目前只支持\n,别的不能用,所以定义时不需要显示声明)。元素间分隔符\002,map中key和value的分隔符为\003。


举例,如源文件中一条记录为:

10000042SOH77SOH435SOH16SOH22SOH1156120000SOH\NSOH\NSOH\NSOH\NSOH\NSOH\NSOH\NSOHyoukuSOH85133.0SOH111

1

1

可以看出存储NULL的\N 浪费了大量空间。


但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


本文作者:网友 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读