本文共 640 字,大约阅读时间需要 2 分钟。
在Hive0.10升级到0.11后我们发现当一个表加字段或者修改字段类型时,新加的分区可以读取到相应字段的值,但是老的分区该字段的值都为NULL(其实数据是在HDFS里的),翻下jira看到Hive在0.11推出一个新feature(HIVE-3833)就是,也就是0.11之前每个分区的schema解析都是按照table来的,而这之后是每个分区的schema都独立的进行解析.
在metastore层面:其实0.10和0.11的schema是一致的:tbls(tbl_id,tbl_name,sd_id),sds(sd_id,cd_id),partitions(tbl_id,sd_id);这两个版本当table发生schema改变时都会改变其sds对应的cd_id指向新的schema,每次新建partition的cd_id都会继承自table的cd_id,不过2个版本的区别就是0.10在读取partition时仍然是按照table的cd_id对应的columns进行解析,而0.11是按照partition的,因此就导致了我们遇到的问题.
这样解决起来也比较简单:1.在tbls上创建触发器来维护 2.或者后台写一个cron来维护;使得partition的cd_id保持和tbls的一致,定期purge columns表.
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1366071,如需转载请自行联系原作者