CONVERT TO DELTA

适用于:check marked yes Databricks SQL check marked yes Databricks Runtime

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

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

语法

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

参数

  • table_name

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

  • NO STATISTICS

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

  • PARTITIONED BY

    按指定的列对创建的表进行分区。 如果 table_name 为路径,则 PARTITIONED BY 对于分区数据是必需的。 如果 table_name 是限定表标识符,则 PARTITIONED BY 子句是可选的,并且分区规范会从元存储中加载。 在任一方法中,如果目录结构不符合所提供或加载的 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.chinacloudapi.cn/path/to/table`
  PARTITIONED BY (date DATE); -- if the table is partitioned

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

注意事项

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

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

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

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

撤消转换

如果执行了可更改数据文件的 Delta Lake 操作(例如 DELETEOPTIMIZE):

  1. 运行以下命令进行垃圾回收:
VACUUM delta.`<path-to-table>` RETAIN 0 HOURS
  1. 删除 <path-to-table>/_delta_log 目录。