The Linux Foundation Projects
Delta Lake

Delta Lake 克隆

作者:Avril Aysha

本博客向您展示如何克隆 Delta Lake 表。

克隆您的 Delta Lake 表是一个很棒的功能,您可以用来迁移数据、重现机器学习流程以及创建数据副本用于共享或实验。对 Delta Lake 克隆所做的任何更改只会影响克隆本身,而不会影响源表。

有不同的方法来克隆您的 Delta Lake 表。例如,您可以使用或不使用 Unity Catalog 来克隆您的 Delta Lake 表。您应该了解它们之间的差异及其应用,以便知道何时使用哪种类型的 Delta Lake 克隆。

本文将详细介绍克隆 Delta Lake 表的不同方法。

让我们开始吧 🪂

Delta Lake 克隆:简介

让我们快速回顾一下。Delta Lake 表由两个主要组件组成:存储在 Parquet 文件中的数据和存储在事务日志中的元数据(包括提交等)。

Delta 克隆(也称为“浅克隆”)只复制表元数据;它们不复制源数据。您可以编辑克隆而不影响源数据,但不能反过来。更改源数据会影响浅克隆数据。

浅克隆速度快且计算成本低,因为不需要复制所有底层数据。但重要的是要记住它们仍然引用相同的源数据。如果您浅克隆一个 Delta Lake 表,并且有人对源数据执行 VACUUM 操作,您的浅克隆将受到影响。

Delta Lake 克隆:浅层

您可以使用以下 SQL 语法创建任何 Delta Lake 表的浅克隆

    CREATE TABLE delta. `/data/target/` SHALLOW CLONE delta. `/data/source/`

这将创建一个位于 /data/source 的表的浅克隆,并将其存储在 /data/target。您需要使用绝对路径。

您可以通过添加 VERSION AS OF 使用版本号或 TIMESTAMP AS OF 使用时间戳表达式来克隆 Delta Lake 源表的特定版本,如下所示

    CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` VERSION AS OF version

    CREATE TABLE db.target_table SHALLOW CLONE delta.`/data/source` TIMESTAMP AS OF timestamp_expression

您的时间戳可以格式化为 YYYY-MM-DD 格式,或使用时间戳表达式,例如 date_sub(current_date(), 1)

您还可以使用以下命令用源表的浅克隆替换现有的目标表

    CREATE OR REPLACE TABLE db.target_table SHALLOW CLONE db.source_table

请注意,目标表需要先清空,以避免数据重复。

您还可以使用以下命令,仅当目标位置不存在该表时才克隆该表

    CREATE TABLE IF NOT EXISTS delta.`/data/target/` SHALLOW CLONE db.source_table

如果您正在从 PySpark 使用 Delta Lake,您可以将 SQL 语法直接传递给 spark.sql(...) 调用。例如

    spark.sql('CREATE TABLE delta.`/data/target/` SHALLOW CLONE delta.`/data/source/` ')

您可以在Delta 文档中阅读有关浅克隆的更多信息。

Delta Lake 克隆和时间旅行

克隆的 Delta Lake 表具有自己的独立历史和版本控制。这意味着对克隆表的时间旅行查询将不会像对其源表那样使用相同的输入进行工作。

假设您有一个版本为 10 的源表,并且您克隆了此表。新(克隆)表将从版本 0 开始。您无法像对源表那样对这个新表运行时间旅行查询。

克隆表会获得自己的新历史记录,并且您无法访问执行克隆之前的历史记录。

在专门的博客中阅读更多关于Delta Lake 时间旅行的信息。

Delta Lake 克隆和 Vacuum

浅克隆引用源目录中的数据文件。

假设您浅克隆了一个 Delta Lake 表。第二天,您的同事对源表运行了一个计划的 VACUUM 操作以清理旧文件。您的克隆表现在无法访问引用的数据文件,并抛出 FileNotFoundException

您可以通过对浅克隆运行带有 replace 的克隆来修复此问题。

在专门的博客中阅读更多关于Delta Lake vacuum 的信息。

Delta Lake 与 Unity Catalog 的克隆

Unity Catalog 是一个用于您所有数据和 AI 资产的开源目录。通过将您的资产注册到 Unity Catalog,您可以清晰地了解所有数据,并可以轻松控制访问和安全权限。

Unity Catalog 以Delta Lake 格式存储表。您可以使用浅克隆从现有 Unity Catalog 表创建新的 Unity Catalog 表。

其语法与我们上面看到的相同。使用 Unity Catalog 引用您的源表和目标表,而不是路径。例如

    CREATE TABLE <catalog-name>.<schema-name>.<target-table-name> SHALLOW CLONE <catalog-name>.<schema-name>.<source-table-name>

您可以将浅克隆与 Unity Catalog 结合使用,创建具有与其父表不同且独立的访问控制权限的表,而无需复制底层数据文件。这可以为您节省大量时间和计算资源。

例如,您可以使用浅克隆与 Unity Catalog 结合使用,在与外部方共享数据时限制对敏感表的访问。

将 Delta Lake 与 Unity Catalog 结合使用,您可以更好地控制您的数据和 AI 资产。

克隆 Parquet 和 Iceberg 表

Delta Lake 支持克隆其他格式的表。您可以使用浅克隆功能来克隆存储在 Parquet 或 Iceberg 格式的表。

此功能将把数据源转换为 Delta 表并进行浅克隆。

使用以下语法将 Parquet 表浅克隆到 Delta Lake 表中

    CREATE OR REPLACE TABLE <target_table_name> SHALLOW CLONE parquet.`/path/to/data`;

使用此语法将 Iceberg 表克隆到 Delta Lake 表中

    CREATE OR REPLACE TABLE <target_table_name> SHALLOW CLONE iceberg.`/path/to/data`;

重要的是要知道,这种通过克隆转换的类型是单向的:克隆后应用于目标表的更改无法同步回源表。

何时使用 Delta Lake 克隆

Delta Lake 克隆是一个很棒的功能,可以帮助您复制和存储特定版本的数据。您可以将其用于复杂的操作,如数据迁移、数据归档、机器学习流程重现、短期实验和数据共享。

让我们看看 4 个具体的用例

  1. 机器学习模型重现
  2. 对生产数据集进行实验
  3. 覆盖表属性
  4. 灾难恢复

Delta Lake 克隆用于机器学习重现

假设您正在进行一个复杂的机器学习项目。您正在使用数据集的特定版本训练您的 ML 模型,并已实现模型的最大性能。

您可以使用 Delta Lake 克隆功能来归档此版本的表,以便未来的模型可以在此标准化数据集上进行测试。这将允许准确比较性能指标。

Delta Lake 克隆用于生产数据实验

您还可以使用 Delta Lake 克隆来测试生产工作流,而不会有损坏生产级表的危险。您可以使用浅克隆快速创建数据的独立副本,可以自由进行实验,而不会影响任何生产工作负载。

使用 SQL 语法,这可能看起来像这样

    # Perform shallow clone
    CREATE OR REPLACE TABLE my_test SHALLOW CLONE my_prod_table;

    # Run some transformations
    UPDATE my_test WHERE user_id is null SET invalid=true;

    # When you're happy, merge any changes you want to keep
    MERGE INTO my_prod_table
    USING my_test
    ON my_test.user_id <=> my_prod_table.user_id
    WHEN MATCHED AND my_test.user_id is null THEN UPDATE *;

    # then drop the cloned table
    DROP TABLE my_test;

Delta Lake 克隆以覆盖表属性

您还可以使用 Delta Lake 克隆来覆盖某些表属性。

当您希望与外部用户共享表并添加带有相关信息的注释时,这会很有帮助。您还可以更改诸如日志保留和文件保留之类的属性,这在创建数据副本以进行长期归档时非常有用。

    CREATE OR REPLACE TABLE archive_table CLONE prod.my_table
    TBLPROPERTIES (
    delta.logRetentionDuration = '3650 days',
    delta.deletedFileRetentionDuration = '3650 days'
    )

Delta Lake 克隆用于灾难恢复

您还可以选择以增量方式同步 Delta 克隆,以保持源表的更新状态以进行灾难恢复。增量克隆意味着对源表的更改会自动转发到目标克隆表。

Delta Lake 克隆

Delta Lake 克隆为您提供了具有不同程度控制和灵活性的数据复制功能。您可以使用 Delta Lake 克隆执行数据迁移和归档,重现生产工作流,并安全地与外部方共享数据。

使用浅克隆来快速廉价地复制数据,这些数据仍然引用原始源数据。

如果您想了解有关 Delta Lake 基础知识的更多信息,请查看Delta Lake vs Data Lake。当您准备深入研究时,您可能会喜欢阅读有关所有使用Delta Lake 进行 ETL 的方法。

LinkedIn 上关注我们的作者