CONVERT TO DELTA
适用于: Databricks SQL Databricks Runtime
将现有的 Parquet 表就地转换为 Delta 表。 此命令会列出目录中的所有文件,创建 Delta Lake 事务日志来跟踪这些文件,并通过读取所有 Parquet 文件的页脚来自动推断数据架构。 转换过程会收集统计信息,以提升转换后的 Delta 表的查询性能。 如果提供表名,则元存储也将更新,以反映该表现在是 Delta 表。
此命令支持转换其基础文件格式为 Parquet 的 Iceberg 表。 在这种情况下,转换器根据 Iceberg 表的本机文件清单、模式和分区信息生成 Delta Lake 事务日志。
语法
CONVERT TO DELTA table_name [ NO STATISTICS ] [ PARTITIONED BY clause ]
参数
-
可选限定的表标识符,或者指向
parquet
或iceberg
文件目录的路径。 名称不得包含时态规范或选项规范。 对于 Iceberg 表,只能使用路径,因为不支持转换托管的 Iceberg 表。 NO STATISTICS
在转换过程中绕过统计信息收集,以更快的速度完成转换。 将表转换为 Delta Lake 后,可以使用
OPTIMIZE ZORDER 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。