Hive分区表新增字段后插入数据显示为null

11 篇文章 1 订阅


对Hive分区表进行新增字段后,会出现一个奇怪的情况,就是往 已经存在的 分区中装载数据后,某些字段的值显示为null,但实际情况是数据文件中对应的字段值其实是有值的。

下面我们重现该问题:

创建一个分区表

在这里插入图片描述
往表中装载数据

在这里插入图片描述


给表新增分区

在这里插入图片描述

 


再往表中装载数据并查询

在这里插入图片描述

 

数据装载成功后,通过查询可以看出,新创建的分区中数据显示正常,但是已经存在的time=20171010分区中新增数据后,新增的字段显示为null。难道数据没有插入成功?

查看分区表在HDFS上对应的数据

在这里插入图片描述

 

可以看出hive表在hdfs上对应的数据文件中相应的字段是有值的,那么为什么通过hive查询出来会是空呢?

那么造成上述问题的原因是什么?原因是修改Hive分区表结构以后,元数据库中的SDS中该表对应的CD_ID会改变,但是该表分区下面对应的CD_ID还是原来表的CD_ID。SDS表主要保存文件存储的基本信息,如INPUT_FORMAT、OUTPUT_FORMAT、是否压缩等。我们先进入mysql中,访问hive的metastore。比如我们这边测试表叫做student,分区字段为time,查看表的CD_ID:

在这里插入图片描述

查看student表所有分区的CD_ID:

在这里插入图片描述

 

可以发现time=20171010分区的CD_ID与time=20171011分区的CD_ID不同,而time=20171011分区的CD_ID的值与SDS表中的CD_ID值是相同的,因此,我们需要手动的更新一下现有分区的CD_ID的值与SDS中student表的CD_ID的值相同:

在这里插入图片描述

 

 

再去查询一下student表,发现字段已经显示值了。

在这里插入图片描述

 

当然,删除分区重建也是可以的,具体选择哪种方法根据实际情况决定,毕竟删除分区是会删除数据的,如果不允许删除原来的数据,建议还是修改元数据。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值