HIVE表修改字段类型后旧分区元数据未更新问题咨询
问题根因
你遇到的是Hive分区表修改字段类型的常见问题,核心原因分两类:
- 如果你用的是ORC、Parquet这类自带schema的自描述存储格式:就算你通过ALTER语句修改了Hive元数据的字段类型,Hive读取这类格式文件时会优先读取文件本身存储的schema,旧分区的底层文件还是按照原来的string类型写入的,所以读取时仍然会识别为string,只有新写入的文件会用更新后的boolean类型写入,所以新分区符合预期。
- 如果你用的是TEXT等不带schema的存储格式:说明你的
CASCADE参数没有生效,部分低版本Hive的CASCADE无法正确批量更新所有存量分区的元数据,旧分区的元数据中C1字段仍然保留string类型。
解决方案
场景1:自描述存储格式(ORC/Parquet等)
你需要将所有存量旧分区按照新的表schema重新覆写,覆写前先执行以下参数设置,强制Hive写入时使用表的最新schema:
-- 全局开启schema演化兼容 set hive.schema.evolution.enabled=true; -- Parquet格式额外设置 set parquet.schema.evolution.enabled=true; set parquet.column.index.access=false; -- ORC格式额外设置 set orc.schema.evolution.enabled=true;
之后对每个旧分区执行INSERT OVERWRITE语句即可,写入完成后底层文件的schema会自动更新为boolean类型。
场景2:非自描述存储格式(TEXT/CSV等)
首先验证旧分区的元数据类型,执行以下语句替换为你的实际分区值查询:DESCRIBE FORMATTED T1 PARTITION (C2='<旧分区的C2值>');
如果返回的C1类型确实为string,说明CASCADE未生效,需要手动批量更新所有旧分区的元数据:
- 执行以下SQL生成所有分区的更新语句:
SELECT CONCAT('ALTER TABLE T1 PARTITION (C2=', ''', C2, ''', ') CHANGE C1 C1 boolean;') FROM T1 GROUP BY C2;
- 批量执行上述生成的所有ALTER语句,完成后刷新表元数据:
MSCK REPAIR TABLE T1;
验证方法
操作完成后再次查询旧分区的字段类型,以及执行查询SELECT typeof(C1) FROM T1 WHERE C2='<旧分区的C2值>' LIMIT 1;确认返回值为boolean即可。
内容的提问来源于stack exchange,提问作者M Michael
相关产品推荐
相关产品推荐

