共用方式為


優化數據檔配置

預測優化會自動在 Unity 目錄受控數據表上執行 OPTIMIZE 。 Databricks 建議為所有 Unity 目錄受控數據表啟用預測優化,以簡化數據維護並減少記憶體成本。 請參閱 Delta Lake 的預測優化。

命令會 OPTIMIZE 重寫數據檔,以改善 Delta 資料表的數據配置。 針對已啟用液體叢集的數據表, OPTIMIZE 請重寫數據檔,以依液體叢集索引鍵來分組數據。 對於已定義數據分割的數據表,檔案壓縮和數據配置會在數據分割內執行。

不含液體叢集的數據表可以選擇性地包含 ZORDER BY 子句,以改善重寫時的數據叢集。 Databricks 建議使用液體叢集,而不是數據分割、 ZORDER或其他數據配置方法。

請參閱 OPTIMIZE

語法範例

您可以執行 命令來 OPTIMIZE 觸發壓縮:

SQL

OPTIMIZE delta.`/data/events`

Python

from delta.tables import *
deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forPath(spark, "/data/events")
deltaTable.optimize().executeCompaction()

或者,或者:

SQL

OPTIMIZE events

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().executeCompaction()

如果您有大量數據,而且只想要優化它的子集,您可以使用 指定選擇性的數據分割述 WHERE詞:

SQL

OPTIMIZE events WHERE date >= '2022-11-18'

Python

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "events")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

注意

  • 量化封裝優化是 等冪的,這表示如果在相同的數據集上執行兩次,則第二次執行沒有任何作用。
  • Bin 封裝的目標是針對磁碟上的大小產生平均平衡的數據檔,但不一定是每個檔案的 Tuple 數目。 不過,這兩個量值最常相互關聯。
  • 適用於執行 OPTIMIZE 作業的 Python 和 Scala API 可從 Databricks Runtime 11.3 LTS 和更新版本取得。

Delta 數據表的讀取器會使用快照集隔離,這表示當從事務歷史記錄中移除不必要的檔案時 OPTIMIZE ,它們不會中斷。 OPTIMIZE 不會對數據表進行任何相關的數據變更,因此在 之前和之後 OPTIMIZE 讀取的結果相同。 在 OPTIMIZE 串流來源的數據表上執行不會影響將這個數據表視為來源的任何目前或未來數據流。 OPTIMIZE 會針對已移除的檔案和作業新增的檔案,傳回檔案統計數據(最小值、最大值、總計等等)。 優化統計數據也包含 Z 排序統計數據、批次數目,以及優化的數據分割。

您也可以使用自動壓縮自動壓縮來自動壓縮小型檔案。 請參閱 Azure Databricks 上 Delta Lake 的自動壓縮。

OPTIMIZE應該執行的頻率?

啟用 Unity 目錄受控數據表的預測優化, OPTIMIZE 以確保在符合成本效益時自動執行。

當您選擇執行 OPTIMIZE的頻率時,效能與成本之間會有取捨。 如需更好的用戶查詢效能,請更頻繁地執行 OPTIMIZE 。 這會產生較高的成本,因為資源使用量增加。 若要將成本優化,請執行成本的頻率較低。

Databricks 建議您從每天執行 OPTIMIZE 開始,然後調整頻率以平衡成本和效能取捨。

執行的最佳實例類型 OPTIMIZE 為何(bin-packing 和 Z-Ordering) ?

這兩個作業都是執行大量 Parquet 解碼和編碼的 CPU 密集作業。

Databricks 建議 計算優化的 實例類型。 OPTIMIZE 也受益於附加 SSD。