最近工作中遇到一个问题:
对于分区表添加字段,向已存在分区中插入数据,结果新增字段的值全部为null。
注:是已存在分区,新的分区并不会产生该问题;无论是内部表还是外部表均有该问题。
在新增字段之后及时对表进行msck repair table 仍然存在问题。
问题描述
Hive版本:2.2.0
创建分区外部表test1
create external table test1(id int) partitioned by (pt_d varchar(11)) location '/user/test1'
插入数据
insert into table test1 partition(pt_d='20170101') values(1),(2);
查看数据
select * from test1;
添加新的字段name
可以通过alter add,也可以通过alter replace
alter table test1 replace columns (
id int
,name string
);
再次查看数据
select * from test1;
修复表
msck repair table test1;
向分区20170101插入数据
insert overwrite table test1 partition(pt_d='20170101') values(1,'1xiao'),(2,'1da');
查看数据
select * from test1;
解决方法
解决该问的关键是删除旧分区,因为虽然HDFS上的数据更新了,但是我们查询的时候仍然查询的是旧的元数据信息(即Mysql中的信息)
在我们插入完数据之后,需要删除元数据的旧分区
alter table table_name drop partition (pt_d='20170101');
然后有两种方式恢复数据
- 1.添加该分区
alter table table_name add partition(pt_d='20170101');
或者通过修复分区也可以
- 2.修复表结构
msck repair table table_name;
再次查看数据,发现插入的数据成功了!!!