轉自:https://blog.csdn.net/lele5000/article/details/89856355
給hive表新增了三個字段,重新insert overwrite了歷史有數據的分區,但是select 新增字段仍然沒有數據,值一直為NULL,莫名其妙
我的修改表結構的sql是這樣子的
alter table app_dlink_project_temp add columns(media_name string COMMENT '媒介名稱');
可是新增的這個字段的值總是NULL
解決辦法很簡單,將修改表結構的sql改成這樣
alter table app_dlink_project_temp add columns(media_name string COMMENT '媒介名稱') cascade;
然后重新insert overwrite,再查詢就新增字段就會有數據了。
另外一種解決方式:
可以手動使用如下命令來對分區添加 alter table 表名 partition(dt='2019-04-26') add columns(字段名 類型);
或者也可以直接將分區數據刪除,然后重新insert,這樣新的字段也會有了
官方文檔描述如下:
The CASCADE|RESTRICT clause is available in Hive 1.1.0. ALTER TABLE ADD|REPLACE COLUMNS with CASCADE command changes the columns of a table's metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.
如上所述,在1.1.0中表和分區的元數據就是分開處理的,在增加字段的時候添加CASCADE能同時更新表和分區 對於,在添加字段的時候沒有指定的cascade的情況
因為我們在重跑數據的時候,雖然HDFS上的數據更新了,但是我們查詢的時候仍然查詢的是舊的元數據信息(即Mysql中的信息)
注意:對於執行了add column語句之后新生成的分區,是不會有問題的,Hive會自動維護新分區中的元數據。