Delta Lake:如何在下一个版本的 delta 表中不携带已删除的记录?

Posted

技术标签:

【中文标题】Delta Lake:如何在下一个版本的 delta 表中不携带已删除的记录?【英文标题】:Delta Lake: how to not carry deleted records in next version of delta table? 【发布时间】:2021-09-23 16:08:32 【问题描述】:

我们每天都在 delta Lake 表(表名:dst1)中加载源文件作为时间序列数据。 如果 deltalake 表不存在,我们将创建一个表。如果表确实存在,我们会将新数据合并为时间序列数据。

Creating Table if table does not exist:
spark.sql(f"CREATE TABLE dtable USING DELTA LOCATION dmount1")       
 

If table does exist we will merge the new data as time series data:
here df --> has data for day 1 
     dtable --> has data for day 0.
     jkey --> d.id=ds.id

spark.sql(f"MERGE INTO dtable d USING df ds ON jkey WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *")

第 1 天的数据来源:

第 2 天的来源数据:

select * from dst1 VERSION AS OF 0
id  lname   fname   gender  satscore
1   Steve   Jobs    M   1100
2   Mapple  Syrup   F   1300
4   Tom     Cruise  M   1200
6   New     Record  F   1320

select * from dst1 VERSION AS OF 1
id  lname   fname   gender  satscore
1   Steve   Not     M   2000
2   Mapple  Syrup   F   1300
4   Tom     Cruise  M   1200
6   New     Record  F   1320

由于第 2 天没有 id 2、4、6,但我仍然在 delta Lake 表的第 1 版中看到它们。 我期望增量表的版本 1 中只有 id 1。 我怎样才能做到这一点?

https://docs.databricks.com/delta/delta-update.html#language-sql

【问题讨论】:

【参考方案1】:

这不是 Delta 的工作方式 - 每个版本都包含应包含的所有数据。它不是所有版本的组合来表示所有数据的统一视图。如果在新版本中只需要从第 2 天开始的条目,则只需覆盖数据,但随后需要单独读取每个版本以构建整个表的视图。

【讨论】:

以上是关于Delta Lake:如何在下一个版本的 delta 表中不携带已删除的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Delta Lake构建批流一体数据仓库

Delta Lake 1.0.0 发布,多项新特性重磅发布

深入剖析 Delta Lake: schema validation

如何在 Zeppelin notebook 和 pyspark 中导入 Delta Lake 模块?

Delta Lake基础介绍(商业版)

Snowflake & Delta Lake两大新型数仓对比分析