**:
hive jira:
最近在查hive版本問題,發現在hive1.1.0和hive1.2.1上,分割槽表新增欄位後新增字段值為空的情況。
網上查了資料,提供了兩種解決辦法:
1. 修改hive元資料sds表的cd_id欄位,原因是修改表結構後,元資料庫中的sds中該表對應的cd_id會改變,但是該錶分割槽下面對應的cd_id還是原來表的cd_id
2.刪除當前分割槽重建
這兩個辦法都不太適應,辦法1修改元資料庫風險大,辦法2可能會導致資料丟失。
老大給的任務是其他辦法workaround。
通過測試發現如下規律,先給出結論:
在分割槽表裡增加欄位後,向分割槽表插入資料有兩種情況:
1.分割槽在修改表結構前存在
2.分割槽在修改表結構前不存在
對於第二種情況,bug不存在
針對第一種情形,
執行alter table denglg add columns(c3 string); 查分割槽資料新增字段值為空,
需再執行alter table denglg partition(step='1') add columns(c3 string);【假設當前只有step='1'的分割槽】
具體測試如下,可以參考看看
1.新建分割槽表,插入兩個分割槽的資料
create table testtmp.denglg(c1 string, c2 string)partitioned by (step string);
insert into table testtmp.denglg partition(step='1') select '1','2' from default.dual;
insert into table testtmp.denglg partition(step='2') select '11','22' from default.dual;
hive> select * from denglg where step='1'; hive> select * from denglg where step='2';
ok ok
1 2 1 1122 2
2.新增欄位c3
alter table denglg add columns(c3 string);
3.向三個分割槽插入資料
insert into table testtmp.denglg partition(step='1') select '1','2','3' from default.dual;
insert into table testtmp.denglg partition(step='2') select '11','22','33' from default.dual;
insert into table testtmp.denglg partition(step='3') select '111','222','333' from default.dual;
hive> select * from denglg where step='1';
ok1 2 null1
1 2 null1
time taken: 0.122 seconds, fetched: 2 row(s)
hive> select * from denglg where step='2';
ok11 22 null2
11 22 null2
time taken: 0.075 seconds, fetched: 2 row(s)
hive> select * from denglg where step='3';
ok111 222 333 3
time taken: 0.077 seconds, fetched: 1 row(s)
發現分割槽step=3不受影響
4.執行alter table denglg partition(step='1') add columns(c3 string);
hive> select * from denglg where step='1';
ok1 2 null1
1 2 31
time taken: 0.728 seconds, fetched: 2 row(s)
hive> select * from denglg where step='2';
ok11 22 null2
11 22 null2
驗證上述結論正確。
hive分割槽表新增字段出現新增欄位null的bug
對於hive分割槽表,我們使用alter語句新增欄位後 如alter table table name add columns age int 再重寫之前已經存在的分割槽,會出現使用查詢語句查出來的新增字段顯示null值。例如 表a 分割槽dt,已有分割槽dt a 由於需求新增了乙個字段,然後重新寫...
hive分割槽表增加字段新增字段值為空的bug
目錄 1.修改元資料 2.刪除當前分割槽重建 3.更新指定分割槽的元資料 最近在查hive版本問題,發現在hive1.1.0和hive1.2.1上,分割槽表新增欄位後新增字段值為空的情況。網上查了資料,提供了兩種解決辦法 修改hive元資料sds表的cd id欄位,原因是修改表結構後,元資料庫中的s...
Hive分割槽表新增欄位為null的bug及解決方法
解決方法 解決該問的關鍵是刪除舊分割槽,因為雖然hdfs上的資料更新了,但是我們查詢的時候仍然查詢的是舊的元資料資訊 即mysql中的資訊 在我們插入完資料之後,需要刪除元資料的舊分割槽 alter table table name drop partition pt d 20170101 然後有兩...