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\’ = \’\’);
节省空间的验证结果如下:
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内容请搜索悠久资源以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源!