若向hive表添加字段,通常會使用下面這種語句
alter table default.testparquet add columns(c8 string);
但是對於分區表來說,
1. 若新建的分區在添加字段之前,新加的字段不會被加到已有分區中。
2. 若新建的分區在添加字段之后,新的分區會繼承表的字段。
這種情況會導致的問題就是在查詢的時候老的分區雖然能查到新加的字段,但是新加字段的值為null。
解決方案:
1. 使用類似這樣的語句:alter table default.testparquet add columns(c8 string) cascade;
經過實驗,只要最后添加的字段使用了cascade,哪怕之前的字段沒有使用cascade也會被同步到已有的分區中。
2. 重建已存在的分區(但要注意如果該hive表是內部表,則在刪除分區的時候會將hdfs中的數據也刪除,所以需要刪之前備份hdfs文件,重建之后恢復hdfs文件)。
以上問題存在於使用Hive進行查詢的時候,不管使用mr還是使用spark作為執行引擎都會出現這種問題。當使用impala進行查詢的時候則不會有此問題。
本文只記錄遇到的問題以及解決方案,對於詳細Hive管理元數據的方式未進行深入研究。
參考:https://stackoverflow.com/questions/40582387/how-to-add-columns-to-existing-hive-partitioned-table