Hive0.10升级到0.11后我们发现当一个表加字段或者修改字段类型时,新加的分区可以读取到相应字段的值,但是老的分区该字段的值都为NULL(其实数据是在HDFS里的),翻下jira看到Hive0.11推出一个新feature(HIVE-3833)就是,也就是0.11之前每个分区的schema解析都是按照table来的,而这之后是每个分区的schema都独立的进行解析.

metastore层面:其实0.100.11schema是一致的:tbls(tbl_id,tbl_name,sd_id),sds(sd_id,cd_id),partitions(tbl_id,sd_id);这两个版本当table发生schema改变时都会改变其sds对应的cd_id指向新的schema,每次新建partitioncd_id都会继承自tablecd_id,不过2个版本的区别就是0.10在读取partition时仍然是按照tablecd_id对应的columns进行解析,而0.11是按照partition的,因此就导致了我们遇到的问题.

这样解决起来也比较简单:1.tbls上创建触发器来维护 2.或者后台写一个cron来维护;使得partitioncd_id保持和tbls的一致,定期purge columns.