分享方式:


Delta Lake 數據表優化和 V 順序

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

什麼是 V 順序?

V-Order 是 Parquet 檔格式 的寫入時間優化,可在 Microsoft Fabric 計算引擎下啟用閃電快速讀取,例如 Power BI、SQL、Spark 等。

Power BI 和 SQL 引擎會使用 Microsoft Verti-Scan 技術和 V 排序的 parquet 檔案,以達到記憶體內部數據存取時間。 Spark 和其他非 Verti-Scan 計算引擎也受益於 V 排序的檔案,其讀取時間平均快 10%,某些案例高達 50%。

V 順序的運作方式是對 parquet 檔案套用特殊的排序、數據列群組散發、字典編碼和壓縮,因此在計算引擎中需要較少的網路、磁碟和 CPU 資源才能讀取,以提供成本效益和效能。 V 順序排序對平均寫入時間有 15% 的影響,但可提供最多 50% 的壓縮。

它是 100% 的開放原始碼 parquet 格式相容;所有 parquet 引擎都可以將其讀取為一般 parquet 檔案。 差異資料表比以往更有效率:Z-Order 等功能與 V 順序相容。 數據表屬性和優化命令可用於其分割區上的控制 V 順序。

V 順序會在 parquet 檔案層級套用。 差異數據表及其功能,例如 Z-Order、壓縮、真空、時間移動等是與 V 訂單正交的,因此相容且可用於額外的優點。

控制 V 順序寫入

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

組態 預設值 說明
spark.sql.parquet.vorder.enabled true 控制工作階段層級 V 順序寫入。
TBLPROPERTIES(“delta.parquet.vorder.enabled”) false 數據表上的預設 V 順序模式
數據框架寫入器選項:parquet.vorder.enabled unset 使用數據框架寫入器控制 V 順序寫入

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

檢查 Apache Spark 工作階段中的 V 順序設定

%%sql 
SET spark.sql.parquet.vorder.enabled 

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

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

在 Apache Spark 工作階段中啟用 V 順序寫入

重要

在工作階段層級啟用時。 所有 parquet 寫入都會啟用 V 訂單。 這包括非 Delta parquet 資料表和 Delta 資料表, parquet.vorder.enabled 且資料表屬性設定為 truefalse

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

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

在資料表建立期間啟用 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 順序會話組態設為 true 或 spark.write 會啟用它,則即使 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 順序之後,只會影響未來對數據表的寫入。 Parquet 檔案會保留建立時所使用的排序。 若要變更目前的實體結構以套用或移除 V 順序,請閱讀下方的<優化數據表時控制 V 順序>一節。

直接控制寫入作業的 V 順序

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

重要

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

在未設定或設定為 false 的工作階段 spark.sql.parquet.vorder.enabled 中,下列命令會使用 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.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()

什麼是優化寫入?

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

Optimize Write 是 Apache Spark 引擎中的 Delta Lake on Microsoft Fabric 和 Azure Synapse Analytics 功能,可減少寫入的檔案數目,並旨在增加寫入數據的個別檔案大小。 您可以使用組態,根據工作負載需求變更目標檔案大小。

此功能預設會在適用於 Apache Spark 的 Microsoft Fabric 運行時間中啟用。 若要深入瞭解優化寫入使用案例,請閱讀在 Apache Spark 上優化寫入的需求一文

合併優化

Delta Lake MERGE 命令可讓使用者使用進階條件來更新差異數據表。 它可以使用 MERGE 命令,將資料從源數據表、檢視或 DataFrame 更新為目標數據表。 不過,Delta Lake 開放原始碼 分佈中的目前演算法並未完全優化以處理未修改的數據列。 Microsoft Spark Delta 小組實作自定義的低隨機合併優化,未修改的數據列會從更新相符數據列所需的昂貴隨機作業中排除。

實作是由 spark.microsoft.delta.merge.lowShuffle.enabled 組態所控制, 預設 會在運行時間中啟用。 它不需要變更程式碼,且與 Delta Lake 的開放原始碼散發完全相容。 若要深入瞭解低隨機合併使用案例,請閱讀差異數據表上的低隨機合併優化一文

差異數據表維護

當差異數據表變更時,效能和記憶體成本效益通常會因為下列原因而降低:

  • 新增至數據表的新數據可能會扭曲數據。
  • 批次和串流數據擷取速率可能會帶來許多小型檔案。
  • 更新和刪除作業最終會建立讀取額外負荷;parquet 檔案依設計是不可變的,因此 Delta 數據表會新增含有變更集的新 parquet 檔案,進一步放大前兩個專案所強加的問題。
  • 不再需要記憶體中可用的數據檔和記錄檔。

為了讓數據表保持最佳狀態,以獲得最佳效能、執行量化壓縮,以及在 Delta 數據表中清理作業。 BIN 壓縮是由 OPTIMIZE 命令所達成;它會將所有變更合併成較大的合併 parquet 檔案。 VACUUM 命令可清除取值記憶體。

數據表維護命令 OPTIMIZE 和 VACUUM 可用於筆記本和 Spark 作業定義,然後使用平臺功能進行協調。 Fabric 中的 Lakehouse 提供一項功能,以使用使用者介面來執行臨機操作數據表維護,如 Delta Lake 數據表維護一文中所述

重要

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

優化數據表時控制 V 順序

下列命令會建構 bin-compact,並使用 V 順序重寫所有受影響的檔案,與 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 順序,所有受影響的檔案都會以 V 順序的形式寫入。 如果 TBLPROPERTIES 未設定或設定為 false 為 V-Order,則會繼承會話設定;因此,若要從數據表中移除 V-Order,請將會話組態設為 false。

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

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