类型扩展

重要

此功能在 Databricks Runtime 15.2 及更高版本中作为公共预览版提供。

启用了类型扩展的表允许将列的数据类型更改为更宽泛的类型,而无需重写基础数据文件。 你可以手动更改列类型,也可以使用架构演变来改进列类型。

类型扩展需要 Delta Lake。 所有 Unity Catalog 托管表都默认使用 Delta Lake。

支持的类型更改

可以根据以下规则扩展类型:

源类型 支持的更广泛类型
byte shortintlongdecimaldouble
short intlongdecimaldouble
int longdecimaldouble
long decimal
float double
decimal 具有更高精度和小数位数的 decimal
date timestampNTZ

为了避免意外将整数值提升为十进制值,必须手动将类型从 byteshortintlong 更改为 decimaldouble

注意

将任何数值类型更改为 decimal 时,总精度必须等于或大于起始精度。 如果还要增加刻度,总精度必须增加相应的量。

byteshortint 类型的最低目标为 decimal(10,0)long 的最低目标为 decimal(20,0)

如果要将两个小数位数添加到具有 decimal(10,1) 的字段,则最小目标为 decimal(12,3)

顶层列和嵌套在结构、映射和数组中的字段支持类型更改。

启用类型扩展

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

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

你还可以在创建表期间启用类型扩展:

  CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')

重要

启用类型扩展时,它将设置表功能 typeWidening-preview,这将升级读取器和编写器协议。 必须使用 Databricks Runtime 15.2 或更高版本才能与已启用类型扩展的表进行交互。 如果外部客户端也与表交互,请验证它们是否支持此表功能。 请参阅 Azure Databricks 如何管理 Delta Lake 功能兼容性?

手动应用类型更改

使用 ALTER COLUMN 命令手动更改类型:

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

此操作可在不重写基础数据文件的情况下更新表架构。

使用自动架构演变扩展类型

架构演变适用于类型扩展以更新目标表中的数据类型以匹配传入数据的类型。

注意

如果未启用类型扩展,架构演变将始终尝试安全地向下转换数据以匹配目标表中的列类型。 如果不希望自动扩展目标表中的数据类型,请在启用架构演变的情况下在运行工作负荷之前禁用类型扩展。

若要使用架构演变来扩展列的数据类型,必须满足以下条件:

  • 相应命令使用 INSERTMERGE INTO
  • 该命令在启用自动架构演变的情况下运行。
  • 目标表已启用类型扩展。
  • 源列类型比目标列类型宽泛。
  • 类型扩展支持类型更改。

不满足所有这些条件的类型不匹配遵循正常的架构强制规则。 请参阅架构强制

禁用类型扩展表功能

通过将属性设置为 false,可以阻止启用的表上发生意外类型扩展:

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

此设置可防止将来对表进行类型更改,但不会删除类型扩展表功能或撤消已更改的类型。

如果需要完全删除类型扩展表功能,可以使用 DROP FEATURE 命令,如以下示例所示:

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

当删除类型扩展时,所有不符合当前表架构的数据文件都会被重写。 请参阅删除 Delta 表功能