如何在不插入某些列的情况下将数据合并到 Delta 表中 (PySpark)

问题描述 投票:0回答:1

上下文:

Delta Lake 允许开发人员使用称为 Merge Statement 的东西将数据合并到表中。 我正在使用 Delta Lake 的更改数据馈送功能来确定我是否要插入、更新或删除特定行。这是由 Delta Lake 创建的列 _change_type 的值决定的。

问题:

很容易使用合并条件中的 _change_type 列,以确定如何处理每一行。问题是,如果我在合并条件中使用此列,它将与其余数据一起插入到我的目标表中。 我不希望我的目标表包含这个 _change_type 列,因为它没有用,而且如果我决定在目标表上也使用 Change Data Feed 会产生冲突。

补充说明:

我知道可以通过固定目标表的模式来解决这个问题,但是,我需要支持目标表上的模式演化,因此,我不能这样做。 理想情况下,我可以在检查合并条件之后但在实际合并到表中之前删除 _change_type 列。这样的事情可能吗?

pyspark merge schema databricks delta-lake
1个回答
0
投票

我从你的问题中得出:

  • 您正在使用适用于 Spark 的 Python API,即 PySpark。
  • 您在 Delta Lake 中工作,因此使用 delta.table API 中的 DeltaTable 类。
  • 您正在尝试通过合并语句更新表。

在这些假设下,这是引起问题的误解:

问题是,如果我在合并条件中使用此列,它将与其余数据一起插入到我的目标表中。

如果您查看官方 Delta 文档,在Upsert into a table using merge 下,您会注意到合并调用中的以下条款:

  • .merge(merge_condition)
  • .whenMatchedUpdate(update_condition)
  • .whenNotMatchedInsert(insert_condition)

这里的关键是合并条件可以基于一个字段(即你的 _change_type 列),但是你的更新或插入条件可以基于完全不同的字段。因此,您只需要保持合并条件不变,但请确保添加/更改您的更新和插入条件以仅包含您想要更新/插入的字段。

如果这对你有用,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.