hive中的NULL(hive空值处理)

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有时候是必须的 :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' = '' );

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值