以增量方式将 Parquet 和 Iceberg 表克隆到 Delta Lake

可以使用 Azure Databricks 克隆功能以增量方式将 Parquet 或 Iceberg 数据源中的数据转换为托管或外部的 Delta 表。

适用于 Parquet 和 Iceberg 的 Azure Databricks 克隆结合了用于克隆 Delta 表将表转换为 Delta Lake 的功能。 本文介绍此功能的用例和限制并提供示例。

重要

此功能目前以公共预览版提供。

注意

此功能需要 Databricks Runtime 11.3 或更高版本。

何时使用克隆以增量方式引入 Parquet 或 Iceberg 数据

Azure Databricks 提供许多选项用于将数据引入湖屋。 Databricks 建议在以下情况下使用克隆引入 Parquet 或 Iceberg 数据:

注意

术语“源表”是指要克隆的表和数据文件,而“目标表”是指操作创建或更新的 Delta 表。

  • 你正在执行从 Parquet 或 Iceberg 到 Delta Lake 的迁移,但需要继续使用源表。
  • 你需要在目标表与接收追加、更新和删除操作的生产源表之间保持仅限引入的同步。
  • 你想要为报告、机器学习或批处理 ETL 创建源数据的 ACID 合规快照。

克隆的语法是什么?

适用于 Parquet 和 Iceberg 的克隆使用的基本语法与用于克隆 Delta 表的语法相同,支持浅度克隆和深度克隆。 有关详细信息,请参阅克隆类型

Databricks 建议对大多数工作负载使用增量克隆。 对 Parquet 和 Iceberg 的克隆支持使用 SQL 语法。

注意

适用于 Parquet 和 Iceberg 的克隆的要求和保证与克隆 Delta 表或转换为 Delta 表不同。 请参阅克隆 Parquet 和 Iceberg 表的要求和限制

若要使用文件路径深度克隆 Parquet 或 Iceberg 表,请使用以下语法:

CREATE OR REPLACE TABLE <target-table-name> CLONE parquet.`/path/to/data`;

CREATE OR REPLACE TABLE <target-table-name> CLONE iceberg.`/path/to/data`;

若要使用文件路径浅度克隆 Parquet 或 Iceberg 表,请使用以下语法:

CREATE OR REPLACE TABLE <target-table-name> SHALLOW CLONE parquet.`/path/to/data`;

CREATE OR REPLACE TABLE <target-table-name> SHALLOW CLONE iceberg.`/path/to/data`;

还可为注册到元存储的 Parquet 表创建深度或浅度克隆,如以下示例所示:

CREATE OR REPLACE TABLE <target-table-name> CLONE <source-table-name>;

CREATE OR REPLACE TABLE <target-table-name> SHALLOW CLONE <source-table-name>;

有关克隆 Parquet 和 Iceberg 表的要求与限制

无论使用深度克隆还是浅度克隆,克隆发生后应用于目标表的更改都无法同步回到源表。 与克隆的增量同步是单向的,允许将源表的更改自动应用于目标 Delta 表。

将克隆用于 Parquet 和 Iceberg 表时,以下附加限制适用:

  • 在克隆和使用表名来标识源表之前,必须将包含分区的 Parquet 表注册到某个目录(例如 Hive 元存储)。 不能对包含分区的 Parquet 表使用基于路径的克隆语法。
  • 不能克隆经历过分区演变的 Iceberg 表。
  • 不能克隆经历过更新、删除或合并操作的 Iceberg“读取时合并”表。
  • 以下是使用截断列上定义的分区克隆 Iceberg 表的限制:
    • 在 Databricks Runtime 13.0 及更低版本中,唯一支持的截断列类型是 string
    • 在 Databricks Runtime 13.1 及更高版本中,可以使用 stringlongint 类型的截断列。
    • Azure Databricks 不支持使用 decimal 类型的截断列。
  • 增量克隆会同步源表中的架构更改和属性,从本地写入克隆表的所有架构更改和数据文件将被替代。
  • Unity Catalog 不支持浅表克隆。

注意

在 Databricks Runtime 11.3 中,此操作不会收集文件级统计信息。 因此,目标表无法受益于 Delta Lake 数据跳过。 Databricks Runtime 12.0 及更高版本中会收集文件级统计信息。