hive中为分区表增加字段需要注意默认不会修改已有分区的字段,导致查询时新增字段为null
若向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
啦啦啦!!!