首页 > 解决方案 > 写入 Delta 表时检测到架构不匹配

问题描述

我收到:

写入 Delta 表时检测到架构不匹配

我尝试遵循以下建议:

要覆盖您的架构或更改分区,请设置:'.option("overwriteSchema", "true")'。

基于此解决方案:写入 Delta 表时检测到架构不匹配 - Azure Databricks

这些都没有解决问题。我做错了什么?如果我想用一个新的集群重用一个旧的笔记本,为什么它会以这种方式运行,我终止的旧的,所以我猜它应该是“干净的”?

我按照以下方式进行:

1.我从GEN2加载数据。它们以这种方式采用镶木地板格式:

spark.read.option("overwriteSchema", "true")\
  .parquet(f"wasbs://{CONTAINER_NAME}@{STORAGE_ACCOUNT_NAME}.blob.core.windows.net/data")

如您所见,我设置overwriteSchematrue.

2.然后我以增量格式保存它:

sd_weather.write.format('delta').mode("overwrite") \
  .save("dbfs:/FileStore/shared_upload/[user]/data_Delta")

3.然后我尝试创建增量表

sd_weather.write.format('delta') \
  .mode("overwrite").saveAsTable("data_Delta")

在这里我收到错误:

AnalysisException:写入 Delta 表时检测到架构不匹配

标签: apache-sparkpysparkdatabricksdelta-lake

解决方案


您需要.option("overwriteSchema", "true")在写入操作中使用,而不是在读取操作中使用:

sd_weather.write.format('delta').mode("overwrite") \
  .option("overwriteSchema", "true") \
  .save("dbfs:/FileStore/shared_upload/[user]/data_Delta")

您还将数据写入两次,一次作为“普通”目录,第二次 - 作为托管表。如果您想在自定义位置创建非托管表,只需将path选项添加到第 3 个变体(也是dbfs:/默认模式,因此您可以省略它):

sd_weather.write.format('delta') \
  .option("overwriteSchema", "true") \
  .option("path", "/FileStore/shared_upload/[user]/data_Delta") \
  .mode("overwrite").saveAsTable("data_Delta")

此外,这取决于架构的不同之处,如果它只是添加列或类似的东西,那么您可以使用mergeSchema而不是overwriteSchema.


推荐阅读