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'
=
''
);