目录
目的:预将hive中 null 与 empty string 统一,便捷后续开发
问题:orc 文件 使用 SET SERDEPROPERTIES('serialization.null.format' = '') 失效
解决方案:探索 null 再各个file_format 的存储方式
TextFile
(一)原始状态
create table test.textfile (id int ,name string);
show create table test.textfile;
CREATE TABLE `test.textfile`(
`id` int,
`name` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://devCluster/user/hive/warehouse/test.db/textfile'
TBLPROPERTIES (
'COLUMN_STATS_ACCURATE'='{\"BASIC_STATS\":\"true\"}',
'numFiles'='0',
'numRows'='0',
'rawDataSize'='0',
'totalSize'='0',
'transient_lastDdlTime'='1622603057')
插入数据,查看 null and empty string 存储形式
insert overwrite table test.textfile values ('1','ddd');
insert into table test.textfile values (2,'');
insert into table test.textfile values (3,null);
insert into table test.textfile values (4,'\N');
insert into table test.textfile values (5,'\\N');
insert into table test.textfile values ('qwe','ppp');
insert into table test.textfile values ('sdd','ooo');
select
*
from
test.textfile
;
发现,id 的数据类型是 int ,插入数值的string类型成功,但是插入字符串后其值变成null。
看一下HDFS中存储的数据,按行存储,null 为 \N
(二)使用参数
使用 SET SERDEPROPERTIES('serialization.null.format' = '')参数
create table test.textfile_par (id int ,name string);
alter table test.textfile_par SET SERDEPROPERTIES('serialization.null.format' = '');
show create table test.textfile_par;
CREATE TABLE `test.textfile_par`(
`id` int,
`name` string)
ROW FORMAT DELIMITED
NULL DEFINED AS ''
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://devCluster/user/hive/warehouse/test.db/textfile_par'
TBLPROPERTIES (
'last_modified_by'='qll',
'last_modified_time'='1623393079',
'numFiles'='0',
'numRows'='0',
'rawDataSize'='0',
'totalSize'='0',
'transient_lastDdlTime'='1623393079')
插入数据,查看 null and empty string 存储形式
insert overwrite table test.textfile_par values ('1','ddd');
insert into table test.textfile_par values (2,'');
insert into table test.textfile_par values (3,null);
insert into table test.textfile_par values (4,'\N');
insert into table test.textfile_par values (5,'\\N');
insert into table test.textfile_par values ('qwe','ppp');
insert into table test.textfile_par values ('sdd','ooo');
SELECT
*
from
test.textfile_par
;
发现,id 的数据类型是 int ,插入数值的string类型成功,但是插入字符串后其值变成null。
id=2 时,name 从 empty string 变成 null,选取空值时,仍然能选择出来
看一下HDFS中存储的数据,按行存储,null 为 empty string