hive中改变表结构(新增表结构)的问题

问题:对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






猜你喜欢

转载自blog.csdn.net/xjp8587/article/details/54342868