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



