Spark中对同一表并发执行数据追加与Alter操作的行为是怎样的?
Spark 并发执行 ALTER 加列与 Append 写入的行为说明
该场景的最终执行结果和 Spark 版本、元数据存储(Metastore)的锁配置、两个操作的执行时序直接相关,以下是默认配置(Hive Metastore 2.x+、Spark 3.x+、开启默认锁机制和 schema 校验)下的典型情况:
场景1:ALTER 命令先获取元数据锁并执行完成
此时 Alter 操作已经成功更新元数据中 db.table 的 schema,新增了3个可空列:year_of_birth int、salary double、city string。
- 后续执行的 Append 操作会先拉取表的最新 schema,对比待写入 DataFrame 的字段后,自动为缺失的3个新增列填充
null值,再写入band=5的新分区 - 最终全表查询无异常,所有分区的3个新增列默认返回
null
场景2:Append 操作先获取元数据锁并执行完成
此时 Append 操作已经基于旧表 schema(仅 band、name、age 三列)完成了 band=5 分区的写入,且更新了元数据中的分区信息。
- 后续执行的 ALTER 操作会成功给表新增3个可空列,更新表级 schema
- 最终全表查询时,Spark 会自动对齐所有分区的 schema 到表级 schema,所有分区缺失的3个新增列统一填充
null,无数据异常
极端异常场景
如果你的 Metastore 未配置事务锁(如低版本 Hive Metastore 未开启锁管理器),两个操作同时提交会出现元数据竞争:
- 要么其中一个操作抛出元数据版本不匹配的异常,执行失败,需要重试
- 要么出现元数据覆盖,ALTER 新增的列被 Append 操作的旧 schema 覆盖,加列操作失效
- 若手动关闭了 Spark 的 schema 校验(配置
spark.sql.sources.schemaCheckEnabled=false),还可能出现分区 schema 与表 schema 不匹配,后续查询列错位、类型报错的问题
内容的提问来源于stack exchange,提问作者vamsi
相关产品推荐
相关产品推荐

