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

重要

此功能目前以公共预览版提供。

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

重要

启用列映射时还会启用随机文件前缀,这将导致无法使用 Hive 样式的分区来浏览数据。 请参阅 Delta Lake 和 Parquet 是否共享分区策略?

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

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

如何启用 Delta Lake 列映射

重要

为表启用列映射会升级 Delta 表版本。 这种协议升级操作是不可逆的。 只能在 Databricks Runtime 10.2 和更高版本中读取启用了列映射的表。

列映射需要以下 Delta 协议:

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

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

可使用以下命令升级表版本并启用列映射:

  ALTER TABLE <table-name> SET TBLPROPERTIES (
    'delta.minReaderVersion' = '2',
    'delta.minWriterVersion' = '5',
    'delta.columnMapping.mode' = 'name'
  )

注意

启用列映射后无法将其关闭。 如果你尝试设置 'delta.columnMapping.mode' = 'none',则会出现错误。

重命名列

注意

可在 Databricks Runtime 10.2 及更高版本中使用。

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

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

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

删除列

注意

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

为 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.1 及更高版本中以公共预览形式提供。

可以提供架构跟踪位置,以便在启用列映射的情况下从 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")
)