问题现象
由于业务需要,添加了在hive原来的表上增加了新字段(alter table partition_test add columns(ads string); ),添加一段时间后发现,新分区的数据查询正常。但是发现涉及以前的分区,新增字段的值都是null。
开始的时候,以为是老分区文件中没有该字段的值导致的,重新跑批生成数据,发现老分区中的字段还是为null。
查看表结构,发现也是有新添加的字段,也就是表的元数据中有新增字段。
问题原因
新增字段后,之前的分区没有同步到新的字段结构,使用的还是之前的元数据信息。而新生成的分区使用的新字段结构的元数据。hive在select分区表的数据时,会根据分区元数据字段去hdfs文件中读取对应字段值。而老分区中没有新字段的元数据,所以没有取到相关值,显示为null 。
解决方案
同步老分区的元数据字段结构。
参考命令:
代码语言:javascript复制alter table partition_test partition(dt='a') add columns(ads string);
同步老分区的元数据后,即可查询到。
后续添加字段的时候,命令里面加cascade就行了,例如:alter table partition_test add columns(col1 string) cascade 。就能同步老分区的字段了。该问题就是hive的联级问题。
参考:
https://cwiki.apache.org/confluence/display/hive/languagemanual ddl
https://blog.csdn.net/mhtian2015/article/details/80855858