共用方式為


Delta Lake 資料表最佳化和 V-Order 排序

LakehouseDelta Lake 資料表格式是 Microsoft Fabric 的核心,確保資料表針對分析進行最佳化是關鍵需求。 本指南涵蓋 Delta Lake 資料表最佳化概念、組態,以及如何將其套用至最常見的巨量資料使用模式。

什麼是 V 順序?

V 順序是對 Parquet 檔案格式的寫入時間最佳化,可在 Power BI、SQL、Spark 等 Microsoft Fabric 計算引擎下實現如閃電般迅速的讀取。

Power BI 和 SQL 引擎利用 Microsoft Verti-Scan 技術和 V 排序的 Parquet 檔案,以達到類似記憶體的資料存取速度。 Spark 和其他非 Verti-Scan 計算引擎也受益於 V 順序檔案,其讀取時間平均加快 10%,在某些情況下高達 50%。

V-Order 的運作方式是對 parquet 檔案套用特殊的排序、資料列群組分配、字典編碼和壓縮,使計算引擎在讀取這些檔案時,需要較少的網路、磁碟和 CPU 資源,從而提升成本效益和效能。 V 順序排序對平均寫入時間有 15% 的影響,但可提供高達 50% 的壓縮率。

完全符合開放原始碼 Parquet 格式;所有 Parquet 引擎都可以將其作為一般 Parquet 檔案進行讀取。 Delta 資料表比以往更高效,其中的功能如 Z-Order 和 V-Order 皆相容。 數據表屬性和優化命令可用來控制其分割區的 V 順序。

V-Order 會在 Parquet 檔案的層級套用。 Delta 資料表及其功能,如 Z-Order 順序、壓縮、清理、時間旅行等,與 V 順序正交,因此它們是相容的,可以一起使用,帶來更多的好處。

控制 V 順序寫入

V 順序 預設 會在 Microsoft Fabric 中啟用,在 Apache Spark 中由下列組態控制。

組態 預設值 說明
spark.sql.parquet.vorder.default 真的 控制會話層級的 V-Order 寫入。
TBLPROPERTIES(“delta.parquet.vorder.default”) false 資料表上的預設 V 順序模式
數據框架寫入器選項:parquet.vorder.default 取消設定 使用 DataFrame 寫入器控制 V 順序寫入

使用下列命令來控制 V 順序寫入的使用方式。

檢查 Apache Spark 會話中的 V-Order 設定

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

停用 Apache Spark 工作階段中的 V 順序寫入

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

啟用 Apache Spark 會話中的 V-Order 寫入

重要

工作階段層級啟用時。 所有 Parquet 寫入都是在啟用 V-Order 的情況下進行的。 這包括 Parquet 非 Delta 資料表和 Delta 資料表,且 parquet.vorder.default 資料表屬性設定為 truefalse

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

使用 Delta 資料表屬性控制 V 順序

在資料表建立期間啟用 V 順序資料表屬性:

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

重要

資料表 屬性設定為 true 時,INSERT、UPDATE 和 MERGE 命令會如預期般運作,並執行寫入時間最佳化。 如果 V 順序工作階段組態設定為 true 或 spark.write 啟用它,則即使 TBLPROPERTIES 設定為 false,寫入也會是 V 順序。

透過變更資料表屬性來啟用或停用 V-Order。

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

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

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

使用資料表屬性啟用或停用 V-Order 之後,只會影響未來對資料表的寫入。 Parquet 檔案會保留當檔案被建立時的排序。 若要變更目前的實體結構來套用或移除 V 順序,請閱讀下方的<最佳化資料表時控制 V 順序>章節。

直接在寫入操作中控制 V 順序

如果未明確設定,所有 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 >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

重要

V 順序僅適用於受謂詞影響的檔案。

spark.sql.parquet.vorder.default 未設定或設定為 false 的會話中,下列命令會使用 V-Order 進行寫入:

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .option("parquet.vorder.default ","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.default","true")\
  .location("Files/people")\
  .execute()

什麼是最佳化寫入?

在 Apache Spark 等巨量資料處理引擎上,分析工作負載在使用標準化較大的檔案大小時,執行效率最高。 檔案大小、檔案數目、Spark 背景工作角色數目及其組態之間的關聯性,對於效能至關重要。 將資料擷取到資料湖資料表可能具有不斷寫入許多小型檔案的繼承特性:此案例通常稱為「小型檔案問題」。

最佳化寫入是 Apache Spark 引擎中 Microsoft Fabric 和 Azure Synapse Analytics 上的 Delta Lake,可減少寫入的檔案數目,並旨在增加寫入資料的個別檔案大小。 可以使用組態依工作負載需求來變更目標檔案大小。

此功能預設在適用於 Apache Spark 的 Microsoft Fabric 執行階段中啟用。 若要深入了解最佳化寫入使用方式案例,請閱讀文章<Apache Spark 上的最佳化寫入需求>。

合併最佳化

Delta Lake MERGE 命令可讓使用者使用進階條件來更新 Delta 資料表。 它可以使用 MERGE 命令將資料從來源資料表、檢視或 DataFrame 更新到目標資料表中。 不過,Delta Lake 開放原始碼發行版中的目前演算法並未針對處理未修改的資料列進行完全最佳化。 Microsoft Spark Delta 小組實施自訂低洗牌合併優化,未修改的資料列會從更新相符資料列所需的昂貴的洗牌操作中排除。

實作由 spark.microsoft.delta.merge.lowShuffle.enabled 組態所控制,預設 在執行階段中啟用。 它不需要變更程式碼,且與 Delta Lake 的開放原始碼發行版完全相容。 若要深入了解 Low Shuffle Merge 的使用案例,請閱讀文章<Delta 表上的 Low Shuffle Merge 最佳化>。

Delta 表維護

當 Delta 資料表發生變更時,效能和儲存成本效益通常會因下列原因而降低:

  • 新增至資料表的新資料可能會扭曲資料。
  • 批次和串流資料擷取速率可能會引入許多小型檔案。
  • 更新和刪除作業最終會導致讀取負荷;依設計,Parquet 檔案是不可變的,因此,Delta 資料表會使用變更集新增新的 Parquet 檔案,進一步加劇前兩個項目帶來的問題。
  • 不再需要儲存體中可用的資料檔案和記錄檔。

為了保持資料表在最佳狀態以獲得高效能,請在 Delta 表中進行檔案壓縮和清理操作。 使用 OPTIMIZE 命令可實現 bin 壓縮;它會將所有變更合併成較大的 Parquet 文件。 VACUUM 命令可以完成取消參考的存儲清理。

資料表維護命令 OPTIMIZEVACUUM 可在筆記本和 Spark 工作定義中使用,然後使用平台功能進行協調。 Fabric Lakehouse 提供一項功能,可使用使用者介面來執行臨機操作資料表維護,如<Delta Lake 資料表維護>一文中所述。

重要

根據擷取頻率和預期的讀取模式正確設計資料表實體結構,可能比執行本區段所述的最佳化命令更重要。

控制資料表最佳化時的 V 順序

下列命令會構建 bin-compact 並使用 V-Order 重寫所有受影響的檔案,無論 TBLPROPERTIES 設定或工作階段組態設定如何:

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

ZORDER 和 VORDER 共同使用時,Apache Spark 會依序執行 bin-compaction、ZORDER 及 VORDER。

下列命令會使用「TBLPROPERTIES」設定來將所有受影響的檔案進行整理壓縮並重新寫入。 如果 TBLPROPERTIES 將 V 順序設定為 true,則所有受影響的檔案都會以 V 順序的形式寫入。 如果未設定 TBLPROPERTIES 或將 V 順序設定為 false,則會繼承工作階段設定;因此,若要從資料表中移除 V 順序,請將工作階段組態設為 false。

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];