使用 V-Order 优化 Delta Lake 表

LakehouseDelta Lake 表格式是Microsoft Fabric的核心。 使 Delta 表保持优化对于分析工作负荷的性能和成本效益至关重要。

本文可帮助你决定何时使用 V 顺序,并显示 Delta 表的主要配置和维护模式。

使用这篇文章来:

  • 了解 V 顺序的更改是什么以及何时有帮助。
  • 了解 Z 顺序和 V 顺序如何相互补充。
  • 选择正确的控制级别:会话、表属性或写操作。
  • 在正确的 Spark 运行时上下文中应用 Delta 表维护模式。

要了解在不同工作负载下何时根据使用场景应用 V 顺序,请参阅 跨工作负载表维护和优化

什么是 V-Order?

V-Order 是 Parquet 文件的写入时优化,可提高跨 Fabric 引擎的下游查询性能。

概览:

  • 其中最有帮助: 读取密集型模式,例如仪表板、交互式分析和重复扫描。
  • 它如何帮助: 重新组织 Parquet 布局(例如行组分布、编码和压缩),以提高读取效率。
  • 典型的权衡: 写入可能需要更长的时间(通常平均大约为 15%),而读取可能会显著改善,具体取决于工作负荷。
  • 引擎兼容性: 文件仍符合开放源代码 Parquet,Z-Order 等 Delta 功能仍保持兼容。
  • 范围: V 顺序是文件级。 可以将压缩、真空和时间旅行等增量作与它一起使用。

控制 V 顺序写入

V-Order 用于优化 Parquet 文件布局,以提高查询性能,尤其是在读取密集型场景中。 在 Microsoft Fabric 中,所有新创建的工作区默认禁用V-Order,以优化写入密集型数据工程工作负荷的性能。

Apache Spark 中的 V-Order 行为通过以下配置进行控制:

配置 默认值 说明
spark.sql.parquet.vorder.default false 控制会话级别的 V 顺序写入。 默认设置为false在新的 Fabric 工作区中。
TBLPROPERTIES("delta.parquet.vorder.enabled") 未设置 控制表级别的默认 V-Order 行为。
DataFrame 编写器选项: parquet.vorder.enabled 未设置 用于在写入操作级别控制 V 顺序。

使用以下命令根据需要为您的场景启用或覆盖 V 顺序写入。

V-Order 在新的 Fabric 工作区(spark.sql.parquet.vorder.default=false)中默认禁用,以提高数据引入和转换管道的写入性能。

对于读取密集型工作负荷(如交互式查询或仪表板),请通过设置 spark.sql.parquet.vorder.defaulttrue 启用 V-Order。 还可以切换到 readHeavyforSparkReadHeavy 资源配置文件,这些配置文件会自动启用 V 顺序,以优化读取性能。

在 Fabric 运行时 1.3 及更高版本中, spark.sql.parquet.vorder.enable 将删除该设置。 由于在 Delta 优化 OPTIMIZE 期间可以自动应用 V-Order,因此不需要这个较旧的设置。 如果要从早期运行时版本迁移,请从代码中删除此设置。

检查 Apache Spark 会话中的 V-Order 配置

在更改当前会话值之前,请使用以下命令确认当前会话值。

%%sql 
SET spark.sql.parquet.vorder.default 

在 Apache Spark 会话中禁用 V-Order 写入

当工作负载以写入为主且需要更快的数据引入或在转换过程中写入时,请使用这些命令。

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

在 Apache Spark 会话中启用 V-Order 写入

在会话级别启用 V-Order 时,该会话中的所有 Parquet 写入都会使用 V-Order,包括非 Delta Parquet 表和 Delta 表,即使 parquet.vorder.enabled 被显式设置为 false

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

使用 Delta 表属性来控制 V-Order

本节仅使用 Spark SQL,因为表属性是通过 SQL DDL 和 ALTER TABLE 语句定义的。

如果希望跨会话应用表级默认值,请使用表属性。

在创建表期间启用 V-Order 表属性:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

当表属性设置为 trueINSERTUPDATEMERGE 时,在写入时应用 V-Order。 会话级和写入级设置仍优先,因此即使TBLPROPERTIES设置为false,写入仍可以使用 V 顺序。

通过更改表属性来启用或禁用 V-Order:

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

使用表属性启用或禁用 V-Order 后,只会影响将来对表的写入。 Parquet 文件会保留创建时使用的排序。 若要更改当前物理结构以应用或删除 V 顺序,请阅读 表压缩

在写入操作中直接管理 V-Order

本部分使用 PySpark 演示数据帧编写器 API。 Scala DataFrame API 中提供了具有等效选项的相同模式。

如果需要按操作控制而不是会话范围或表范围的默认设置,请使用写入级别选项。

在未显式覆盖的情况下,所有 Apache Spark 写命令都会继承会话设置。 以下示例通过继承会话配置,使用 V-Order 编写。

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .saveAsTable("myschema.mytable") 

V-Order 仅适用于符合条件的文件。

在会话中,当spark.sql.parquet.vorder.default未设置或设置为false时,以下命令使用 V-Order 进行写入:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .option("parquet.vorder.enabled","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()