當查詢將大型 Delta Lake 資料表與較小且經過過濾的資料表聯結時,篩選器的值直到查詢執行時才會被知道。 若不進行執行時修剪,查詢會掃描大資料表中的每一個檔案,甚至是沒有相符列的檔案。 動態檔案清理解決了這個問題。 執行時,優化器會將連接一側的篩選結果推送到 Delta Lake 資料表的掃描,並跳過無法包含相符列的檔案。
動態檔案修剪預設是啟用的。 你不需要更改查詢才能受益。
當動態檔案剪枝適用時
動態檔案剪枝僅適用於 Delta Lake 資料表上的聯結。 在 MERGE 陳述式中,當合併條件比較來源欄位與目標欄位是否相等時,它會使用來源的連接鍵值跳過目標檔案。 在 UPDATE 和 DELETE 語句中,當條件包含一個子查詢且進行相同類型的比較時,則適用。
在 MERGE、UPDATE 和 DELETE 語句中進行動態檔案剪枝需要啟用 Photon 的運算資源。 對於 SELECT 陳述式,Photon 有更廣泛且更可靠的動態檔案剪枝功能。 沒有 Photon,動態檔案修剪可能仍適用於 SELECT 語句,視查詢形狀和執行計畫而定。 請參閱 什麼是 Photon?。
動態檔案修剪對非分割資料表及在非分割欄位上的聯結表現提升最大。 預設情況下,只有當 join 中的大型 Delta Lake 資料表至少有 10 GB 且至少有 10 個檔案時,才會觸發。 請參閱設定。
動態檔案剪枝也能減少寫入衝突。 當 Delta Lake 在提交過程中檢查衝突時,會考慮被動態檔案修剪略過的檔案。 這能減少失敗交易的數量。 請參閱 隔離層級並撰寫衝突。
最佳做法
動態檔案刪減的效能效應與資料的聚類方式相關。 如果你連接的值分散在所有檔案中,動態檔案修剪只能略過很少的檔案。 為了幫助動態檔案剪枝跳過更多檔案,請遵循以下做法:
- 在你經常聯結的欄位上使用 liquid clustering,這樣相符的資料列就能共置於較少的檔案中。
- 使用支援 Photon 的運算,因為
MERGE、UPDATE和DELETE陳述式需要這類運算來進行動態檔案修剪。
配置
大多數工作負載不需要更改這些設定。 如果與較小的 Delta Lake 資料表進行聯結時需要修剪,但低於預設大小或檔案數量門檻,請考慮調整閾值。
以下 Apache Spark 設定屬性控制動態檔案剪枝:
| Property | 類型 | 預設 | Description |
|---|---|---|---|
spark.databricks.optimizer.dynamicFilePruning |
Boolean |
true |
可以開啟或關閉動態檔案剪枝功能。 |
spark.databricks.optimizer.deltaTableSizeThreshold |
Long |
10000000000 (10 GB) |
觸發動態檔案剪枝的連接中大型 Delta Lake 資料表的最小大小(以位元組為單位)。 對於較小的資料表,掃描整張資料表通常比下推篩選條件便宜。 若要查詢 Delta Lake 資料表的大小,請執行 DESCRIBE DETAIL table_name 並檢查 sizeInBytes 欄位。 |
spark.databricks.optimizer.deltaTableFilesThreshold |
Integer |
10 |
在聯結中觸發動態檔案剪枝的 Delta Lake 大型資料表最少檔案數 如果資料表的檔案數少於這個門檻,動態檔案修剪就不會執行,因為對於只有少數檔案的資料表,動態檔案修剪可能不值得。 要查詢 Delta Lake 表格中的檔案數量,請執行 DESCRIBE DETAIL table_name 並檢查欄位 numFiles 。 |