【问题标题】:A schema mismatch detected when writing to the Delta table写入 Delta 表时检测到架构不匹配
【发布时间】:2021-12-15 20:10:54
【问题描述】:

我收到:

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

我尝试遵循建议:

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

基于此解决方案:A schema mismatch detected when writing to the Delta table - Azure Databricks

  • 我添加了这样一个选项,但它看起来不起作用或者我只是 做错了。
  • 我清理了dbfs:/delta-tables/_delta_log/
  • 我什至尝试删除我保存数据的整个文件夹 (dbfs:/FileStore/shared_upload/[user]/data_Delta)。

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

我按以下方式进行:

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

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

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

2.然后我保存为delta格式:

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-spark pyspark databricks delta-lake


    【解决方案1】:

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

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

    您还将数据写入两次,一次作为“普通”目录,第二次 - 作为托管表。如果您想在自定义位置创建非托管表,只需将 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

    【讨论】:

    • 感谢 Alex(再次)帮助我学习 Spark,并指出我犯的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多