写入Delta表检测到schema不匹配,设置overwriteSchema仍无效如何解决
问题根因
你遇到的A schema mismatch detected when writing to the Delta table(写入Delta表时检测到Schema不匹配)报错,核心来自以下几个操作错误:
overwriteSchema参数配置位置错误:该参数是Delta表写入操作的专属参数,你配置在了读取Parquet的环节,Parquet读取逻辑不识别该参数,完全不会生效。- 清理路径错误:你清理的
dbfs:/delta-tables/_delta_log/是Delta表默认存储路径的全局日志,你自己创建的表日志存储在dbfs:/FileStore/shared_upload/[user]/data_Delta/_delta_log/路径下,所以之前的清理操作完全没有命中目标。 - 元数据残留冲突:你删除了存储层的Delta文件路径,但Spark metastore中还残留了之前同名
data_Delta表的旧Schema元数据,调用saveAsTable时会优先匹配metastore中的旧Schema,触发不匹配报错。 - 重复写入冲突:你先调用
save方法把数据写入了dbfs:/FileStore/shared_upload/[user]/data_Delta路径,后续调用saveAsTable如果没有指定路径,默认会在metastore默认路径下创建同名表,两个独立的Delta表Schema校验不通过就会触发报错。
修复方案
按以下步骤操作即可解决:
- 先清理残留的旧表元数据,执行如下代码:
spark.sql("DROP TABLE IF EXISTS data_Delta")
- 确认对应存储路径的旧文件已完全删除,你之前已经删过可以跳过这步,没删的话执行:
dbutils.fs.rm("dbfs:/FileStore/shared_upload/[user]/data_Delta", recurse=True)
- 写入时正确添加
overwriteSchema参数,不需要单独先调用save存文件,直接调用saveAsTable即可,如果需要指定存储路径就加path参数:
# 仅创建metastore表,数据存在默认路径 sd_weather.write.format('delta') \ .mode("overwrite") \ .option("overwriteSchema", "true") \ .saveAsTable("data_Delta") # 如果需要指定自定义存储路径,加path参数即可 sd_weather.write.format('delta') \ .mode("overwrite") \ .option("overwriteSchema", "true") \ .option("path", "dbfs:/FileStore/shared_upload/[user]/data_Delta") \ .saveAsTable("data_Delta")
内容的提问来源于stack exchange,提问作者QbS
相关产品推荐
相关产品推荐

