Delta Lake 合并不更新模式(启用自动模式演变)

Posted

技术标签:

【中文标题】Delta Lake 合并不更新模式(启用自动模式演变)【英文标题】:Delta lake merge doesn't update schema (automatic schema evolution enabled) 【发布时间】:2020-11-17 21:54:44 【问题描述】:

当我执行下面的代码线I得到一个错误:

deltaTarget.alias('target').merge(df.alias('source'), mergeStatement).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()

的错误是如下:

AnalysisException:无法解析在UPDATE给出子句中的列目标列的列表 NEW_COLUMN。在“NEW_COLUMN”确实不在目标增量表的模式,而是根据documentation,这应该只是更新增量表的现有架构和添加列。 P>

我也用这个命令启用autoMerge:

spark.conf.set("spark.databricks.delta.schema.autoMerge.enabled ","true")

我不知道究竟是什么原因导致这种错误,因为在过去我能与这些代码精确的零件自动进化增量表的模式。 P>

有什么,我可以俯瞰? P>

【问题讨论】:

可以请你分享,你使用的是什么databricks运行时? SPAN> 在我来说这竟然是一个错误的错误消息,隐藏了真正的问题。 (当然,它的显示错误的错误信息中的错误) - 这是不匹配两场之间类型的我试图在合并中加入上成命令跨度> 【参考方案1】:

如果我没记错的话,你需要在 MERGE 操作中使用 insertAll 或 updateAll 选项

【讨论】:

但是操作指定这个他使用updateAll/insertAll(格式为whenMatchedInsertAll等【参考方案2】:

我和你有同样的问题,但我发现在 delta Lake docs 中,它可能不支持带有 upsertAll() 和 insertAll() 的部分列; 所以我选择了 upsertExpr() 和 insertExpr() ,大地图包含所有列。

delta lake merge : Schema validation

【讨论】:

以上是关于Delta Lake 合并不更新模式(启用自动模式演变)的主要内容,如果未能解决你的问题,请参考以下文章

数据湖三剑客:Hudi vs Delta Lake vs Iceberg

Delta Lake 版本管理(13)

将数据写入 Azure 数据块中的 Delta Lake 时出现问题(检测到不兼容的格式)

Delta Lake 学习

Pyspark Delta Lake 捕获表不是 delta 表异常

Spark重磅 | Apache Spark社区的Delta Lake开源