Lakehouse與Delta Lake表格是Microsoft Fabric的核心。 保持 Delta 表格的最佳化是分析工作負載效能與成本效益的關鍵。
本文將協助你決定何時使用 V-order,並說明 Delta 表格的主要配置與維護模式。
利用本文:
- 了解V-order會改變什麼,以及它什麼時候有效。
- 了解 Z 階和 V 階如何互補。
- 選擇正確的控制層級:會話、資料表屬性或寫入操作。
- 在正確的 Spark 執行環境中套用 Delta 表格維護模式。
關於根據消耗情境何時應用 V 命令的跨工作負載指引,請參見 跨工作負載表維護與優化。
什麼是V-order?
V-order 是一種針對 Parquet 檔案的寫入時間優化,能提升跨 Fabric 引擎的下游查詢效能。
一覽:
- 它最有幫助的地方:以大量閱讀為主的模式,如儀表板、互動式分析和重複掃描。
- 功能說明: 重新組織 Parquet 佈局(例如列分群分布、編碼與壓縮),以提升讀取效率。
- 典型的取捨: 寫入可能需要較長時間(平均約15%),而讀取則會根據工作負載大幅改善。
- 引擎相容性: 檔案仍維持開源 Parquet 相容性,且 Delta 功能如 Z-Order 仍維持相容性。
- 範圍: V-order 是檔案層級的。 可使用壓縮、真空和時間旅行等三角洲運算。
控制 V 順序寫入
V-order 用於優化 Parquet 檔案的配置,以提升查詢效能,特別是在讀取量大的情境下。 在 Fabric 中,所有新建立的工作區預設會停用 V-order,以優化對寫入量大的資料工程工作負載的效能。
Apache Spark 中的 V 命令行為透過以下配置來控制:
| 組態 | 預設值 | 說明 |
|---|---|---|
spark.sql.parquet.vorder.default |
false |
控制會話層級的V指令撰寫。 在新的 Fabric 工作區中,預設為 false。 |
TBLPROPERTIES("delta.parquet.vorder.enabled") |
未設定 | 控制桌面層級預設的 V-order 行為。 |
DataFrame 寫入器選項: parquet.vorder.enabled |
未設定 | 用於在寫入操作層級控制 V 順序。 |
根據你的情境,請使用以下指令啟用或覆寫 V-order 寫入。
在新的 Fabric 工作區中spark.sql.parquet.vorder.default=false預設關閉 V-order,以提升擷取與轉換管線的寫入效能。
對於閱讀量大的工作負載,如互動式查詢或儀表板,請透過設定 spark.sql.parquet.vorder.default 為 true來啟用 V-order。 你也可以切換到 readHeavyforSpark 或 資源 ReadHeavy 設定檔,這些設定檔會自動啟用 V 順序,以提升閱讀聚焦效能。
在 Fabric 執行 1.3 及之後版本中,該 spark.sql.parquet.vorder.enable 設定被移除。 因為 V 階數可以在 Delta 優化時自動套用,你 OPTIMIZE不需要這個舊設定。 如果你是從較早的執行版本遷移過來,請從程式碼中移除這個設定。
檢查 Apache Spark 會話中的 V-order 設定
在更改之前,請使用這些指令確認目前的會話值。
在 Apache Spark 會話中停用 V 命令寫入
當你的工作負載寫入量大,想要更快的擷取或轉換寫入時,可以使用這些指令。
在 Apache Spark 會話中啟用 V 命令寫入
當你在會話層級啟用 V 順序時,該會話中的所有 Parquet 寫入都會使用 V-order,包括非 Delta Parquet 資料表及即使 parquet.vorder.enabled 明確設定為 false的 Delta 資料表。
利用 Delta 表性質進行控制 V 階
本節使用 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");
當表格屬性設定為 true、 INSERT、 UPDATE、 並 MERGE 於寫入時套用 V 順序。 會話層級與寫入層級設定仍優先,因此即使 TBLPROPERTIES 設定為 false,寫入仍可使用 V-order。
透過修改表格屬性來啟用或停用 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 階,請閱讀 Table compaction。
直接控制寫入操作中的 V 順序
本節使用 PySpark 來示範 DataFrame writer API。 Scala DataFrame API 也有相同模式,並提供等效選項。
當你需要針對每個操作進行控制時,請使用寫入層級的選項,而不是使用整個會話或整個資料表的預設值。
所有 Apache Spark 寫入指令在未明確覆寫時都會繼承會話設定。 以下範例是透過繼承會話配置來使用 V 順序撰寫。
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 順序寫入:
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()