Delta Lake 允许开发人员使用称为 Merge Statement 的东西将数据合并到表中。 我正在使用 Delta Lake 的更改数据馈送功能来确定我是否要插入、更新或删除特定行。这是由 Delta Lake 创建的列 _change_type 的值决定的。
很容易使用合并条件中的 _change_type 列,以确定如何处理每一行。问题是,如果我在合并条件中使用此列,它将与其余数据一起插入到我的目标表中。 我不希望我的目标表包含这个 _change_type 列,因为它没有用,而且如果我决定在目标表上也使用 Change Data Feed 会产生冲突。
我知道可以通过固定目标表的模式来解决这个问题,但是,我需要支持目标表上的模式演化,因此,我不能这样做。 理想情况下,我可以在检查合并条件之后但在实际合并到表中之前删除 _change_type 列。这样的事情可能吗?
我从你的问题中得出:
在这些假设下,这是引起问题的误解:
问题是,如果我在合并条件中使用此列,它将与其余数据一起插入到我的目标表中。
如果您查看官方 Delta 文档,在Upsert into a table using merge 下,您会注意到合并调用中的以下条款:
.merge(merge_condition)
.whenMatchedUpdate(update_condition)
.whenNotMatchedInsert(insert_condition)
这里的关键是合并条件可以基于一个字段(即你的 _change_type 列),但是你的更新或插入条件可以基于完全不同的字段。因此,您只需要保持合并条件不变,但请确保添加/更改您的更新和插入条件以仅包含您想要更新/插入的字段。
如果这对你有用,请告诉我。