最近在工作中遇到一个问题:他人修改了数据表之后(加了两个字段,但是没有选择级联更改),用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查不到数据。