CONVERT TO DELTA

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime

将现有的 Parquet 表就地转换为 Delta 表。 此命令列出目录中的所有文件,创建跟踪这些文件的 Delta Lake 事务日志,并通过读取所有 Parquet 文件的页脚自动推断数据 schema。 转换过程收集统计信息以提高转换后的 Delta table的查询性能。 如果提供表名,则元存储也将更新,以反映该表现在是 Delta 表。

此命令支持转换其基础文件格式为 Parquet 的 Iceberg 表。 在这种情况下,转换器基于 Iceberg table的本机文件清单、schema 和分区信息生成 Delta Lake 事务日志。

语法

CONVERT TO DELTA table_name [ NO STATISTICS ] [ PARTITIONED BY clause ]

Parameters

  • table_name

    可选限定的表标识符,或者指向 parqueticeberg 文件目录的路径。 名称不得包含 时态规范或选项规范。 对于 Iceberg 表,只能使用路径,因为不支持转换托管的 Iceberg 表。

  • NO STATISTICS

    在转换过程中绕过统计信息收集,以更快的速度完成转换。 table 转换为 Delta Lake 后,可以使用 OPTIMIZE ZORDER BY 重新组织数据布局和 generate 统计信息。

  • PARTITIONED BY

    按指定的列对创建的表进行分区。 如果 table_name 为路径,则 PARTITIONED BY 对于分区数据是必需的。 如果 table_name 是限定表标识符,则 PARTITIONED BY 子句是可选的,并且分区规范会从元存储中加载tableidentifierpartition。 在任一方法中,如果目录结构不符合所提供或加载的 PARTITIONED BY 规范,转换过程将中止并引发异常。

    注意

    在 Databricks Runtime 11.1 及更低版本中,PARTITIONED BY 是所有分区数据的必需参数。

示例

注意

无需为 Iceberg 表或注册到元存储的表提供分区信息。

CONVERT TO DELTA database_name.table_name; -- only for Parquet tables

CONVERT TO DELTA parquet.`abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/table`
  PARTITIONED BY (date DATE); -- if the table is partitioned

CONVERT TO DELTA iceberg.`abfss://container-name@storage-account-name.dfs.core.windows.net/path/to/table`; -- uses Iceberg manifest for metadata

注意事项

Delta Lake 未跟踪的文件均不可见,运行 VACUUM 时可将其删除。 在转换过程中,请勿更新或追加数据文件。 转换表后,请确保通过 Delta Lake 执行所有写入。

多个外部表可能都使用同一个基础 Parquet 目录。 在这种情况下,如果在某个外部 tables上运行 CONVERT,则可能无法访问其他外部 tables,因为它们的基础目录已从 Parquet 转换为 Delta Lake。 若要再次查询或写入这些外部表,还必须在这些表上运行 CONVERT

CONVERT 将 catalog 信息(如 schema 和 table 属性)填充到 Delta Lake 事务日志。 如果基础目录已转换为 Delta Lake,并且其元数据与目录元数据不同,则会引发 convertMetastoreMetadataMismatchException

使用 Databricks Runtime 时,如果希望 CONVERT 覆盖 Delta Lake 事务日志中的现有元数据,请将 SQL 配置 spark.databricks.delta.convert.metadataCheck.enabled 设置为 false。