公司动态
【ORC】ORC 的 Schema Evolution 在读取旧版本文件时,Reader 如何处理缺失或新增的列?
ORC 的 Schema Evolution 在读取旧版本文件时,Reader 如何处理缺失或新增的列?发布时间:2026年4月10日问题引入:从 Flink CDC 实时入湖的 Schema 冲突说起在构建一个基于 Flink CDC 的实时数据湖平台时,我们遇到了一个棘手的线上事故。上游 MySQL 数据库的业务表user_profile新增了一个非空字段risk_level(风控等级),而下游的 Flink 作业在消费 Binlog 并写入 ORC 格式的数据湖时,由于未及时更新 Sink 端的 Schema,导致新写入的 ORC 文件包含了这个新字段。然而,历史的查询作业(如 Spark SQL)仍然使用旧的 Schema(不含risk_level)去读取所有分区的数据,包括新写入的分区。结果,作业在读取新分区时抛出了SchemaEvolutionException,整个 ETL 链路中断。这次事故的核心在于我们对ORC Schema Evolution机制的理解不足。ORC 作为一个支持 Schema 演进的格式,其 Reader 在面对“读取 Schema”与“文件 Schema”不一致时,有一套精密的处理逻辑。本文将深入剖析 Apache ORC 2.3.0 中 Schema Evolut