情况:
表: test_table
已有字段 (a,b,c)
已有分区:
day_key=20131201
day_key=20131202
day_key=20131203
需求是需要添加一个字段d
并且重新生成 所有分区的数据
步骤
1.添加字段:
alter table test_table add columns (d string);
2.执行语句
insert overwrite table test_table
select ....
此时问题产生了:
发现 新加的字段d 列 生成出来的数据
在已有的分区中
全是NULL
解决办法3个:
A1.新版本解决办法:
修改分区表修改语句 在最后加上关键字 cascade 即可。
alter table test_table changge ..... cascade;
A.直接在hive里面解决
删除对应的分区 day_key=20131201
alter table test_table drop partition (day_key='20131201');
然后再次生成数据 发现d列的数据产生了。
B.修改元数据库
修改SDS表 老分区对应的 CD_ID
与表的 CD_ID 保持一致。
在元数据库查询:
select * from SDS where LOCATION like '%tb_name%'\G
我们可以看到 所有分区 以及表 对应的CD_ID
如果我们对字段进行了修改
新生成分区的 CD_ID 的最新的 (与COLUMS表的一致)
而老分区 (不管你重新插入数据多少次) 都是与表(TBLS)的TBL_ID保持一致的!!
当我们重新计算数据之后 又不想重建分区
只需 :
update SDS set CD_ID=119 where SD_ID=116;
其中 119为其它新分区的 CD_ID 116 为表的TBL_ID
当然后面如果再次 add columns
也可以用同样的办法
update SDS set CD_ID=120 where SD_ID=119;
其中 120 为其它新分区的 CD_ID 119 为表之前过期的CD_ID
希望能帮助有同样问题的人。