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
希望能幫助有同樣問題的人。