HIVE HDFS对NULL值处理

当Hive写入NULL值到HDFS时,数据会显示为'N'。解决此问题的方法是修改表的serialization.null.format属性。可以通过创建表时设定或建表后使用ALTER语句来改变这一特性。例如,可以将NULL值存储为空字符串。这将影响HDFS文件中的数据表示,可能需要重新插入数据以应用更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值