因将线上表的某个字段的类型进行了更改,进而引发了下面两个问题:
- 字段的声明类型和parquet存储时的类型不一致
- table schema和partition schema不一致
致使数据表直接无法使用。
具体出错的问题从执行日志中可以清楚的看到。
问题1
问题:将字段类型改成int类型,但是报错信息提示parquet文件对应字段类型是int64,设置的字段类型与实际存储的类型不一致
解决:将字段类型改为bigint使与parquet存储时一致,数据表可以正常使用。
问题2
问题:由于以前的分区已经运行完成,这些分区使用的还是以前的schema。在修改了字段类型后,table schema就发生变化,以至于table和partition schema不一致,select报错。
解决:解决思路是将现有和过去所有分区的数据使用新的schema进行更新。遇到的场景是以前的分区不重要,因此直接使用ALTER TABLE <table_name> DROP PARTITION (<partition_col>=<val>)
删除以前的分区,再次运行即可。如果以前分区数据比较重要,可以按照新的schema更新所有分区的数据。