问题:对Hive分区表新增字段后,在执行插入分区的动作,会发现其实数据文件中已经有新字段值了,但是在查询的时候新字段的值还是显示为null。
网上百度的解决方法:
1. 修改hive元数据SDS表的CD_ID字段,原因是修改表结构后,元数据库中的SDS中该表对应的CD_ID会改变,但是该表分区下面对应的CD_ID还是原来表的CD_ID
2.删除当前分区重建
首先对hive中的表分两种,分区表和非分区表
1、分区表
首先先建立一张分区表,并向其中插入数据
create table xjp_test_20170111_2 (c1 string, c2 string) partitioned by (etl_dt string) stored as orc;
insert into table tmp.xjp_test_20170111_2 partition(etl_dt='1')values('1','2')
查询结果:
hive> select * from tmp.xjp_test_20170111_2 where etl_dt='1' ;
OK
1 2 1
改变表结构
alter table tmp.xjp_test_20170111_2 add columns (c3 string);
创建一个原来不存在的分区
insert into table tmp.xjp_test_20170111_2 partition(etl_dt='2')values('a','b','c');
select * from tmp.xjp_test_20170111_2 where etl_dt='2' ;
OK
a b c 2
向原来存在的分区中导入数据
insert into table tmp.xjp_test_20170111_2 partition(etl_dt='1')values('11','22','33');
select * from tmp.xjp_test_20170111_2 where etl_dt='1' ;
OK
1 2 NULL 1
11 22 NULL 1
解决办法:
需再执行alter table tmp.xjp_test_20170111_2 partition(etl_dt='1') add columns(c3 string);
select * from tmp.xjp_test_20170111_2 where etl_dt='1' ;
OK
1 2 NULL 1
11 22 33 1
2、非分区表
create table tmp.xjp_20170111_1(c1 string,c2 stirng);
insert into table tmp.xjp_20170111_1 values('1','2');
insert into table tmp.xjp_20170111_1 values('a','b');
alter table tmp.xjp_20170111_1 add columns (c3 string);
insert into table tmp.xjp_20170111_1 values('z','x','c');
select * from tmp.xjp_20170111_1;
OK
1 2 NULL
a b NULL
z x c
总结:
非分区表不存在此种情况;
在分区表里增加字段后,向分区表插入数据有两种情况:
1.分区在修改表结构前存在
2.分区在修改表结构前不存在
对于第二种情况,bug不存在
参考博客:http://www.ithao123.cn/content-10640232.html