Hive学习小记-(9)hive分区表加字段**

转自:https://blog.csdn.net/lxpbs8851/article/details/17118841

情况:

表: test_table

已有字段 (a,b,c)

已有分区:

day_key=20131201

day_key=20131202

day_key=20131203

需求是需要添加一个字段d,用add加的字段在末尾

并且重新生成 所有分区的数据

步骤

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 add .....   cascade;

 tips:如果已经执行添加操作,并且没有带cascade,可以尝试下面的方法:

1、使用replace 恢复表结构,这样历史的分区数据都不会消失
alter table industry_db.product replace
columns(product_name string comment ‘产品名’);

2、然后再使用带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

原文地址:https://www.cnblogs.com/foolangirl/p/14218555.html