使用变体切碎优化性能

变体拆分通过将常见字段存储为底层 Parquet 文件中的单独列,提高了对 VARIANT 列的查询性能。 分片减少了读取字段所需的 I/O,并使用分列格式(而不是二进制 blob)提高压缩效果。

请参阅VARIANT类型Apache Iceberg 和 Delta Lake 的变体类型支持以及查询变体数据

Requirements

需要 Databricks Runtime 17.3 或更高版本才能读取和写入切碎的 VARIANT 表。 为了通过变体统计信息收集和数据跳过获得最佳查询性能,Databricks 建议使用 Databricks Runtime 18.1 或更高版本。

启用粉碎

从 Databricks Runtime 17.3 版本开始,使用 VARIANT 创建包含一个或多个 CREATE TABLE 列的新表时,会自动启用 shredding。

CREATE OR REPLACE TABLEALTER TABLE 不自动启用切碎。 这可以避免改变现有表和工作负载的拆分行为。

对于现有表,可以通过将 enableVariantShredding 表属性设置为 TRUE 来手动选择启用分片,也可以通过将该属性设置为 FALSE 来选择禁用分片:

Delta Lake

ALTER TABLE my_table SET TBLPROPERTIES ('delta.enableVariantShredding' = 'true');

冰山表

ALTER TABLE my_table SET TBLPROPERTIES ('iceberg.enableVariantShredding' = 'true');

通过检查表属性 enableVariantShredding 是否设置为 true,验证是否启用了切碎。

对特定表禁用分片处理

若要从将来写入的切碎中排除特定表,请将 enableVariantShredding 表属性设置为 FALSE

Delta Lake

ALTER TABLE my_table SET TBLPROPERTIES ('delta.enableVariantShredding' = 'false');

冰山表

ALTER TABLE my_table SET TBLPROPERTIES ('iceberg.enableVariantShredding' = 'false');

从现有表中删除切碎

若要删除现有表上的切碎,请使用命令删除该功能 ALTER TABLE 。 此操作还会将碎片化的 VARIANT 数据原地重写为完整的 VARIANT 格式,并将 enableVariantShredding 表属性设置为 false。

ALTER TABLE my_table DROP FEATURE "variantShredding";

Limitations

  • 数据碎片化会导致写入产生一些开销。
  • 启用分片不会自动转换表中的现有 VARIANT 数据。 它仅适用于启用该功能后写入的数据。 若要重写现有 VARIANT 数据,请使用 REORG TABLE my_table APPLY (SHRED VARIANT)
  • 粉碎适用于结构中的顶级 VARIANT 列或 VARIANT 字段,不包括 VARIANT 存储在数组或映射中的数据。