1. 程式人生 > >HIVE 分割槽表新增欄位後的奇怪現象

HIVE 分割槽表新增欄位後的奇怪現象

情況:

表: 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

解決辦法2個:

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

希望能幫助有同樣問題的人。