写入增量时检测到模式不匹配 table

A schema mismatch detected when writing to the Delta table

我收到:

A schema mismatch detected when writing to the Delta table

我试着听从建议:

To overwrite your schema or change partitioning, please set: '.option("overwriteSchema", "true")'.

基于此解决方案:

None 已解决此问题。 我做错了什么? 如果我想用一个新集群重用一个旧笔记本,我终止了旧笔记本,为什么它会以这种方式运行,所以我猜它应该是 'clean'?

我按照以下方式进行:

1.I 从 GEN2 加载数据。它们采用镶木地板格式:

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

如你所见,我将 overwriteSchema 设置为 true

2.Then我保存为delta格式:

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

3.Then 我尝试创建 Delta Table

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

这里我收到错误:

AnalysisException:写入 Delta 时检测到模式不匹配 table

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

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

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

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

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