Delta列映射
注意
此功能在Delta Lake 1.2.0及以上版本中可用。该功能目前处于实验阶段,存在已知限制。
列映射功能允许Delta表的列与底层Parquet文件的列使用不同名称。这使得可以在Delta表上执行诸如RENAME COLUMN和DROP COLUMNS等模式演进操作,而无需重写底层Parquet文件。该功能还允许用户使用Parquet不允许的字符(例如空格)来命名Delta表列,这样用户可以直接将CSV或JSON数据摄取到Delta中,而无需因之前的字符限制而重命名列。
如何启用Delta Lake列映射
重要
为表启用列映射会升级Delta 表版本。此协议升级不可逆。启用了列映射的表只能在Delta Lake 1.2及以上版本中读取。
列映射需要以下Delta协议:
读取器版本2或更高。
Writer版本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',将会收到错误提示。
重命名列
当为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变更数据馈送的下游操作。请参阅启用列映射的表的变更数据馈送限制。
在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模式。