hive分割槽表新增字段出現新增欄位null的bug

2021-08-21 02:58:47 字數 1874 閱讀 3810

對於hive分割槽表,我們使用alter語句新增欄位後(如alter table table_name add columns(age int)),再重寫之前已經存在的分割槽,會出現使用查詢語句查出來的新增字段顯示null值。

例如:表a ,分割槽dt,已有分割槽dt=』a』,由於需求新增了乙個字段,然後重新寫a

分割槽資料,寫完後使用select發現新增欄位為null值(但是實際的hdfs檔案中是存在新增列的資料)。

起初我以為是我指令碼sql的問題,在花費了半天時間排除各種錯誤原因後發現竟然是hive本身的問題。hive jira:

修改hive元資料sds表的cd_id欄位,原因是修改表結構後,元資料庫中的sds中該表對應的cd_id會改變,但是該錶分割槽下面對應的cd_id還是原來表的cd_id。本人沒有嘗試,直接修改元資料風險較大

因為本身寫入hdfs的檔案是沒問題的,若是表是外部表,可以先執行刪除分割槽命令

alter table table_name drop partition(dt='a')
然後,再執行修復分割槽命令,msck repair table table_name,或者alter table table_name add partition(dt=』a』)。

若是非外部表,可以執行刪除分割槽命令後,再重寫分割槽。

結果顯示null,實際上是由於分割槽元資料缺少新新增的字段導致的,可以通過如下語句往出錯的分割槽元資料中新增這個列。

alter table partition_test partition(dt='a') add columns(age int);
create external table tmp.partition_test(

id int

) partitioned by(dt string)

insert overwrite table partition_test partition(dt='a') values(1);

select * from partition_test;

#1 a

alter table partition_test add columns(name string);

select * from partition_test;

#1 null a

insert overwrite table partition_test partition(dt='a') values(1,'1');

select * from partition_test;

#1 null a

alter table partition_test drop partition(dt='a');

msck repair table partition_test;

select * from partition_test;

#1 1 a

alter table partition_test add columns(age int);

insert overwrite table partition_test partition(dt='a') values(1,'1',1);

select * from partition_test;

#1 1 null a

alter table partition_test partition(dt='a') add columns(age int);

select * from partition_test;

#1 1 1 a

注:實際上在新增欄位是可以通過cascade關鍵字來,避免出現這種問題。如alter table table_name add columns(age int) cascade

Hive分割槽表新增欄位為null的bug及解決方法

解決方法 解決該問的關鍵是刪除舊分割槽,因為雖然hdfs上的資料更新了,但是我們查詢的時候仍然查詢的是舊的元資料資訊 即mysql中的資訊 在我們插入完資料之後,需要刪除元資料的舊分割槽 alter table table name drop partition pt d 20170101 然後有兩...

Hive分割槽表新增欄位為null的bug及解決方法

原文 最近工作中遇到乙個問題 對於分割槽表新增字段,向已存在分割槽中插入資料,結果新增欄位的值全部為null。注 是已存在分割槽,新的分割槽並不會產生該問題 無論是內部表還是外部表均有該問題。在新增字段之後及時對錶進行msck repair table 仍然存在問題。問題描述 hive版本 2.2....

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

情況 表 test table 已有字段 a,b,c 已有分割槽 day key 20131201 day key 20131202 day key 20131203 需求是需要新增乙個欄位d 並且重新生成 所有分割槽的資料 步驟 1.新增字段 alter table test table add ...