使用 Delta Lake 列映射重命名和删除列

Azure Databricks 支持 Delta Lake 表的列映射,这样就可以进行仅限元数据的更改,以将列标记为已删除或已重命名,而无需重新编写数据文件。 用户还可以使用 Parquet 不允许的字符(例如空格)来命名 Delta 表列,这样便可以直接将 CSV 或 JSON 数据引入 Delta,而无需因先前的字符限制而重命名列。

重要

只能在 Databricks Runtime 10.4 LTS 及更高版本中读取启用了列映射的表。

对表启用列映射可能会中断依赖于增量更改数据馈送的下游操作。 请参阅启用了列映射的表的更改数据馈送限制

在表上启用列映射可能会中断从作为源的 Delta 表进行的流式读取,在 Delta Live Tables 中也是如此。 请参阅使用列映射和架构更改进行流式处理

启用列映射

列映射需要以下 Delta 协议:

  • 读取器版本 2 或更高版本。
  • 写入器版本 5 或更高版本。

对于具有所需协议版本的 Delta 表,可以通过将 delta.columnMapping.mode 设置为 name 来启用列映射。

可以使用以下命令启用列映射:

  ALTER TABLE <table-name> SET TBLPROPERTIES (
    'delta.columnMapping.mode' = 'name'
  )

请参阅禁用列映射

重命名列

注意

在 Databricks Runtime 10.4 LTS 及更高版本中可用。

为 Delta 表启用列映射后,你可以重命名列:

ALTER TABLE <table-name> RENAME COLUMN old_col_name TO new_col_name

有关更多示例,请参阅更新 Delta Lake 表架构

删除列

注意

在 Databricks Runtime 11.3 LTS 及更高版本中可用。

为 Delta 表启用列映射后,你可删除一列或多列:

ALTER TABLE table_name DROP COLUMN col_name
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...)

有关更多详细信息,请参阅更新 Delta Lake 表架构

列名中支持的字符

为 Delta 表启用列映射后,可以在表的列名中包含空格以及以下任何字符:,;{}()\n\t=

通过列映射和架构更改进行流式处理

重要

此功能在 Databricks Runtime 13.3 LTS 及更高版本中作为公共预览版提供。

可以提供架构跟踪位置,以便在启用列映射的 Delta 表中启用流式处理。 这解决了非累加架构更改可能导致流中断的问题。

针对数据源的每个流式读取都必须指定自己的 schemaTrackingLocation。 指定的 schemaTrackingLocation 必须包含在为目标表的 checkpointLocation 指定的目录中,以便进行流式写入。

注意

对于合并来自多个源 Delta 表的数据的流式处理工作负载,需要在每个源表的 checkpointLocation 中指定唯一目录。

选项 schemaTrackingLocation 用于指定架构跟踪的路径,如以下代码示例所示:

checkpoint_path = "/path/to/checkpointLocation"

(spark.readStream
  .option("schemaTrackingLocation", checkpoint_path)
  .table("delta_source_table")
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .toTable("output_table")
)

禁用列映射

在 Databricks Runtime 15.3 及更高版本中,可以使用 DROP FEATURE 命令从表中删除列映射并降级表协议。

请参阅删除 Delta 表功能