共用方式為


優化數據檔配置

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

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

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

注意

ZORDER 是 Delta Lake 專屬的優化。 Apache Iceberg 表格則採用叢集與排序策略。

請參閱 OPTIMIZE

重要

在 Databricks Runtime 16.0 和更新版本中,您可以使用 OPTIMIZE FULL 來強制啟用液體叢集的數據表重新叢集。 請參閱 以強制重新分群所有記錄

語法範例

執行以下指令觸發壓縮:OPTIMIZE

SQL

OPTIMIZE table_name

Python

Python DeltaTable API 是專為 Delta Lake 設計的。

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

程式語言 Scala

Scala DeltaTable API 是針對 Delta Lake 專屬的。

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

如果你有大量資料且只想優化其中一部分,請指定一個可選的分割謂詞,使用:WHERE

SQL

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

Python

Python DeltaTable API 是專為 Delta Lake 設計的。

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

程式語言 Scala

Scala DeltaTable API 是針對 Delta Lake 專屬的。

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
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 排序統計資料、批次數量,以及優化的分割區。

您也可以使用自動壓縮自動壓縮來自動壓縮小型檔案。 參見 自動壓實

OPTIMIZE應該執行的頻率?

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

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

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

執行OPTIMIZE (bin-packing 和 Z-Ordering)的最佳實例類型是什麼?

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

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