hive 写入null后在hdfs 中显示\N 存储,如果直接读取hdfs则会直接读到\N数值
如何解决这个问题,需要对表属性中的null值存储进行修改,具体的表serialization.null.format可以在desc formatted 查询具体表属性
Storage Desc Params:
serialization.format 1
serialization.null.format N
场景构建:
临时表创建
CREATE TABLE `test_null_case_data`(
`id` int,
`id_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
'/****/test_null_case_data'
写入测试数据:
insert overwrite table test_null_case_data
select 2 as id,'jie' as id_name
union all
select 1 as id,null as id_name
查询数据结果
select * from test_null_case_data
id id_name
2 jie
1
dfs -cat /****/test_null_case_data/000000_0
2<0x01>jie
1<0x01>\N
注:可以看到在结果表里面查询是正常了显示null值,但是在hdfs的文件中显示的为\N的结果。如果数据走文件处理的话,访问程序需要处理\N,或者调整表null值存储处理。
解决方案:
创建表时可以设变null存储类型,或者建表后修改null特性
创建表时可以指定:
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
with serdeproperties('serialization.null.format' = '')
或
ROW FORMAT DELIMITED NULL DEFINED AS ''
完整语句
CREATE TABLE `test_null_case_data`(
`id` int,
`id_name` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
with serdeproperties('serialization.null.format' = '')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'/****/test_null_case_data'
创建表后alter指定:(修改特性后表hdfs数据内容不会变,需要重新插入数据)
alter table test_null_case_data SET SERDEPROPERTIES('serialization.null.format' = '')
除了以null值修改成空字符串还有其他形式:\N,'',NULL
每个null值的表示对应的修改和查询都有所差异:
设置 SET SERDEPROPERTIES('serialization.null.format' = '');
查询显示为空字符串'',文件查询显示:''
设置 SET SERDEPROPERTIES('serialization.null.format' = 'NULL');
查询显示为空字符串'',文件查询显示:NULL
设置 SET SERDEPROPERTIES('serialization.null.format' = '\N');
查询显示为空字符串'',文件查询显示:\N