数据库其它

关注公众号 jb51net

关闭
首页 > 数据库 > 数据库其它 > Hive中的NULL

关于Hive中的NULL空值处理问题

作者:longshenlmj

这篇文章主要介绍了关于Hive中的NULL空值处理问题,Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能,需要的朋友可以参考下

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

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

但hive的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

到此这篇关于关于Hive中的NULL空值处理问题的文章就介绍到这了,更多相关Hive中的NULL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文