Delta 列映射
列映射功能允许 Delta 表列和底层 Parquet 文件列使用不同的名称。这使得 Delta 模式演化操作(例如 Delta 表上的 RENAME COLUMN
和 DROP COLUMNS
)无需重写底层 Parquet 文件。它还允许用户使用 Parquet 不允许的字符(例如空格)来命名 Delta 表列,这样用户就可以直接将 CSV 或 JSON 数据摄取到 Delta 中,而无需因之前的字符限制而重命名列。
如何启用 Delta Lake 列映射
标题为“如何启用 Delta Lake 列映射”的部分列映射需要以下 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 表启用了列映射时,您可以重命名列
ALTER TABLE <table_name> RENAME COLUMN old_col_name TO new_col_name
有关更多示例,请参阅重命名列。
删除列
标题为“删除列”的部分当 Delta 表启用了列映射时,您可以删除一个或多个列
ALTER TABLE table_name DROP COLUMN col_name;
ALTER TABLE table_name DROP COLUMNS (col_name_1, col_name_2, ...);
有关更多详细信息,请参阅删除列。
列名中支持的字符
标题为“列名中支持的字符”的部分当 Delta 表启用了列映射时,您可以在表的列名中包含空格以及以下任何字符:,;{}()\n\t=
。
已知限制
标题为“已知限制”的部分- 在表上启用列映射可能会破坏依赖 Delta 更改数据源的下游操作。请参阅启用列映射的表的更改数据源限制。
- 在 Delta Lake 2.1 及更早版本中,Spark Structured Streaming 读取在启用列映射的表上被明确阻止。
- 在 Delta Lake 2.2 及更高版本中,Spark Structured Streaming 读取在进行了列重命名或列删除的启用列映射的表上被明确阻止。
- 在 Delta Lake 3.0 及更高版本中,Spark Structured Streaming 读取需要对进行了列重命名或列删除的启用列映射的表启用模式跟踪。请参阅跟踪非累加模式更改
- Delta 表协议指定了两种列映射模式,按
name
和按id
。Delta Lake 2.1 及更早版本不支持id
模式。