最近在工作中遇到一個問題:他人修改了數據表之後(加了兩個字段,但是沒有選擇級聯更改),用spark引擎查是可以查到數據,用tez/hive來查新增的兩個字段的值是null值。
最後發現是分區的元數據和表的元數據不一致導致的,分區的元數據少了新增的兩個字段,所以查出來數據是null。
下面是兩段代碼,分別查表的元數據信息和分區的元數據信息:
#查表的元數據信息
desc table_name;
#查對應分區的元數據信息
desc table_name partition(分區字段='分區值')
對比發現各自元數據的不一致。
那麼發現了問題,如何進行修正呢?
總不能把表刪掉重建吧,世上也沒有後悔藥,能讓你在進行更改字段的時候選擇級聯更改。
那該怎麼辦呢?解決辦法如下:
alter table tablename change 字段名 字段名 字段類型 cascade;
重新修改字段類型,再改回來,這樣就能刷新所有分區的元數據了。
問題解決!
疑問:爲什麼當時更改完字段之後,spark能查到數據而tez\hive卻查不到呢?
個人猜想:可能spark sql查詢的時候使用的表的元數據去進行查詢,而tez\hive用的是對應分區的元數據去查詢,所以spark能查到數據而hive\tez查不到數據。