使用 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 表功能。