可以看出存储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' = '')
实现,注意两者必须一起使用,如
CREATETABLE 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 '' 如
CREATETABLE 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)修改已存在的表
altertable hive_tb set serdeproperties('serialization.null.format' = '');