一、问题点
有一个hive外部表,分区字段是tp和month,新增了几个字段fee_org_id,applied_date_time,pop_coop_mode_type_cd,fee_company后,insert overwrite重跑分区数据,
SELECT * FROM app.app_xxx_indicator_result WHERE tp = 'fs' AND month = '2021-04'
用hive引擎查询如下,新增的几个字段是null
而用presto查询如下,不为null
使用alter table语句更新结构时,hive默认更新现有分区元数据,对原来已经存在的分区元数据不会变动,导致已经存在的分区新增字段后,重跑数据时,查询新增的字段值出现为null情况,而后来新增的分区就没有这样的问题
至于presto查询有数据,而hive查询无数据,猜测应该是presto和hive使用的元数据不一样,hive使用自身的存储的元数据,presto没有使用元数据,应该是直接去hdfs获取的最新的表信息。
二、解决方案
1、删除分区后重建分区(推荐)
删除分区
ALTER TABLE app.app_xxx_indicator_result DROP partition(MONTH = '2021-04') ;
重新添加分区
ALTER TABLE app.app_xxx_indicator_result ADD partition(tp = 'fs', MONTH = '2021-04') ;
此方案,删除分区数据后,分区数不会删除,重新添加分区后,再次查询出来的字段就不为null了。缺点是分区很多的情况下,需要挨个执行
2、删除表后重建表(不建议)
此种方案为下策,删除表代价太大,数据也面临丢失风险,不到万不得已不可取
3、命令修复表分(无效)
有人说msck repair 可以,然而经过测试,无效,查询出来的依然为null
msck repair TABLE app.app_xxx_indicator_result;