Delta类型扩展

注意

该功能在Delta Lake 3.2及以上版本中作为预览功能提供。

类型扩展功能允许将Delta表中的列类型更改为更宽泛的类型。这支持通过ALTER TABLE ALTER COLUMN命令手动更改类型,以及在INSERTMERGE INTO命令中使用模式演进自动迁移类型。

支持的类型变更

Delta Lake 3.2及以上版本中的功能预览支持有限的类型变更:

  • BYTE 转换为 SHORTINT

  • SHORT 转换为 INT

类型变更支持顶级列以及嵌套在结构体、映射和数组中的字段。

如何启用Delta Lake类型扩展

重要

启用类型扩展会设置Delta表功能typeWidening-preview,这是一个读写协议功能。一旦设置此表功能,只有支持该功能的客户端才能对表进行读写操作。您必须使用Delta Lake 3.2或更高版本来读写此类Delta表。

您可以通过将表属性delta.enableTypeWidening设置为true来在现有表上启用类型扩展:

  ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')

或者,您可以在创建表时启用类型扩展:

  CREATE TABLE <table_name> USING DELTA TBLPROPERTIES('delta.enableTypeWidening' = 'true')

禁用类型扩展:

  ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')

禁用类型扩展可以防止未来的类型变更被应用到表中。它不会影响之前已应用的类型变更,特别是不会移除类型扩展表功能,也不会允许不支持类型扩展表功能的客户端读写该表。

要从表中移除类型扩展表功能并允许不支持此功能的其他客户端读写该表,请参阅移除类型扩展表功能

手动应用类型变更

当在Delta表上启用类型扩展时,您可以使用ALTER COLUMN命令更改列的类型:

ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>

表模式已更新,无需重写底层的Parquet文件。

支持自动模式演变的类型变更

在使用INSERTMERGE INTO命令进行数据摄取时,类型变更会自动应用,当满足以下条件时:

  • 目标表上启用了类型扩展。

  • 该命令运行时启用了自动模式演进功能。

  • 源列类型比目标列类型更宽。

  • 将目标列类型更改为源类型是一种支持的类型变更

当满足所有条件时,目标表的模式会自动更新,将目标列类型更改为源列类型。

移除类型扩展表功能

可以使用DROP FEATURE命令从Delta表中移除类型扩展功能:

 ALTER TABLE <table_name> DROP FEATURE 'typeWidening-preview' [TRUNCATE HISTORY]

有关删除Delta表功能的更多信息,请参阅Drop Delta table features

当禁用类型扩展功能时,必要时会重写底层的Parquet文件,以确保文件中的列类型与Delta表模式中的列类型匹配。 从表中移除类型扩展功能后,不支持该功能的Delta客户端即可对该表进行读写操作。