優化數據檔配置
預測優化會自動在 Unity 目錄受控數據表上執行 OPTIMIZE
。 Databricks 建議為所有 Unity 目錄受控數據表啟用預測優化,以簡化數據維護並減少記憶體成本。 請參閱 Unity Catalog 受控資料表的預測性最佳化。
命令會 OPTIMIZE
重寫數據檔,以改善 Delta 資料表的數據配置。 針對已啟用液體叢集的數據表, OPTIMIZE
請重寫數據檔,以依液體叢集索引鍵來分組數據。 對於已定義數據分割的數據表,檔案壓縮和數據配置會在數據分割內執行。
不含液體叢集的數據表可以選擇性地包含 ZORDER BY
子句,以改善重寫時的數據叢集。 Databricks 建議使用液體叢集,而不是數據分割、 ZORDER
或其他數據配置方法。
請參閱 OPTIMIZE。
重要
在 Databricks Runtime 16.0 和更高版本中,您可以使用 OPTIMIZE FULL
來強制進行啟用了液態叢集的數據表的重新叢集。 請參閱 以強制重新分群所有記錄。
語法範例
您可以執行 命令來 OPTIMIZE
觸發壓縮:
SQL
OPTIMIZE table_name
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
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
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
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 排序統計數據、批次數目,以及優化的數據分割。
您也可以使用自動壓縮自動壓縮來自動壓縮小型檔案。 請參閱 Azure Databricks 上 Delta Lake 的自動壓縮。
我 OPTIMIZE
應該執行的頻率?
啟用 Unity 目錄受控數據表的預測優化, OPTIMIZE
以確保在符合成本效益時自動執行。
當您選擇執行 OPTIMIZE
的頻率時,效能與成本之間會有取捨。 如需更好的用戶查詢效能,請更頻繁地執行 OPTIMIZE
。 這會產生較高的成本,因為資源使用量增加。 若要將成本優化,請執行成本的頻率較低。
Databricks 建議您從每天執行 OPTIMIZE
開始,然後調整頻率以平衡成本和效能取捨。
執行的最佳實例類型 OPTIMIZE
為何(bin-packing 和 Z-Ordering) ?
這兩個作業都是執行大量 Parquet 解碼和編碼的 CPU 密集作業。
Databricks 建議 計算優化的 實例類型。
OPTIMIZE
也受益於附加 SSD。