差異資料表上的低隨機合併優化
Delta Lake MERGE 命令 可讓使用者使用進階條件來更新差異資料表。 它可以使用 MERGE 命令,將資料從來源資料表、檢視或 DataFrame 更新為目標資料表。 不過,目前的演算法並未完全優化以處理 未修改的資料 列。 使用低隨機合併優化時,未修改的資料列會從更新相符資料列所需的昂貴隨機作業中排除。
為什麼我們需要低隨機合併
目前 MERGE 作業是由兩個 Join 執行來完成。 第一個聯結是使用整個目標資料表和來源資料,以尋找目標資料表的觸控 檔案清單 ,包括任何相符的資料列。 之後,它會執行第二個聯結,唯讀取那些 觸控的 檔案和來源資料,以執行實際的資料表更新。 即使第一個聯結是減少第二個聯結的資料量,但觸控 檔案中 仍有大量 未修改的資料 列。 第一個聯結查詢較輕,因為它只會讀取指定比對條件中的資料行。 資料表更新的第二個數據行需要載入所有資料行,這會產生昂貴的隨機處理常式。
使用低隨機合併優化,Delta 會暫時保留第一個聯結的相符資料列結果,並將其用於第二個聯結。 根據結果,它會從繁重的隨機處理常式中排除 未修改 的資料列。 比對 資料列和 未修改的資料 列會有兩個不同的寫入作業,因此相較于先前的行為,可能會導致輸出檔案數目 為 2 倍。 不過,預期效能提升超過可能的小型檔案問題。
可用性
注意
- 低隨機合併可作為預覽功能。
其適用于 Apache Spark 3.2 和 3.3 版的 Synapse 集區。
版本 | 可用性 | 預設 |
---|---|---|
Delta 0.6 / Spark 2.4 | No | - |
Delta 1.2 / Spark 3.2 | Yes | false |
Delta 2.2 / Spark 3.3 | Yes | true |
低隨機合併的優點
- 觸控 檔案中 未修改的資料列會分開處理,而不會進行實際的 MERGE 作業。 它可以節省整體 MERGE 執行時間和計算資源。 當複製許多資料列,且只會更新幾個資料列時,增益會更大。
- 未修改的資料列會保留資料列順序。 因此,如果檔案已排序或 Z-ORDERED,則未修改資料列的輸出檔案對於略過資料仍然有效率。
- 即使 MERGE 條件符合所接觸檔案中所有資料列的情況,也會有很小的額外負荷。
如何啟用和停用低隨機合併
設定集區或會話的組態之後,所有 Spark 寫入模式都會使用此功能。
若要使用低隨機合併優化,請使用下列組態加以啟用:
- Scala 和 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true
若要檢查目前的組態值,請使用 命令,如下所示:
- Scala 和 PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`
若要停用此功能,請變更下列組態,如下所示:
- Scala 和 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false