外部數據表的數據分割探索
本文說明 Unity Catalog 外部表的預設分區探索策略,以及啟用分區元數據日誌的選擇性設定,讓分區探索與 Hive 中繼資料存放區一致。
Databricks 建議針對具有數據分割的 Unity 目錄外部數據表啟用數據分割元數據記錄,以改善讀取速度和查詢效能。
Unity 目錄的預設分割區探索策略為何?
根據預設,Unity 目錄會以遞歸方式列出數據表位置中的所有目錄,以自動探索分割區。 對於具有許多數據分割目錄的大型數據表,這可能會增加許多數據表作業的延遲。
使用分割區元數據記錄
重要
這項功能處於公開預覽狀態。
在 Databricks Runtime 13.3 LTS 和更新版本中,您可以選擇性地啟用分區元數據記錄,這是註冊至 Unity Catalog 的外部表的分區發現策略。 此行為與Hive中繼存放區中使用的分割區探索策略一致。 此行為只會影響具有分割區並使用 Parquet、ORC、CSV 或 JSON 的 Unity 目錄外部數據表。 Databricks 建議啟用新的行為,以改善這些數據表的讀取速度和查詢效能。
重要
啟用了分區元數據記錄的資料表在分割發現方面會有行為變更。 Unity 目錄不自動掃描數據分割的數據表位置,而只會遵守在分割區元數據中註冊的數據分割。 請參閱 手動新增、卸除或修復分割區元資料。
此行為將會在未來的 Databricks Runtime 版本中成為預設值。 已啟用此功能的數據表只能使用 Databricks Runtime 13.3 LTS 和更新版本來讀取或寫入。
注意
您必須嘗試使用 Databricks Runtime 12.2 LTS 或以下查詢數據表,以確認它不會使用新的數據分割記錄行為。
啟用分割區元數據記錄
若要在數據表上啟用數據分割元數據記錄,您必須為目前的SparkSession啟用Spark conf,然後建立外部資料表。 只有在建立數據表的SparkSession中才需要此設定。 建立已啟用數據分割元數據記錄的數據表之後,它會將此設定保存為數據表元數據的一部分,並在所有後續工作負載中使用此功能。
下列語法示範如何使用 SQL 在筆記本中設定 Spark conf。 您也可以在設定計算時設定 Spark 組態。
SET spark.databricks.nonDelta.partitionLog.enabled = true;
重要
您只能在 Databricks Runtime 13.3 LTS 及更高版本中,啟用分割區元數據記錄時,讀取和寫入資料表。 如果您有在 Databricks Runtime 12.2 LTS 或以下執行且必須與數據表互動的工作負載,請勿使用此設定。
當您卸除外部資料表時,不會刪除基礎數據檔。 Databricks 建議使用 CREATE OR REPLACE
語法來升級數據表以使用分割區元數據記錄,如下列範例所示:
CREATE OR REPLACE TABLE <catalog>.<schema>.<table-name>
USING <format>
PARTITIONED BY (<partition-column-list>)
LOCATION 'abfss://<bucket-path>/<table-directory>';
Unity 目錄會對表格和磁碟區的路徑重疊強制實施規則。 如果數據表已存在於該位置,則無法在數據檔集合上註冊新的 Unity 目錄數據表。
使用具備分割區元數據的表格
Databricks 建議在對所有已註冊到 Unity Catalog 的數據表進行讀取和寫入操作時使用數據表名稱。 對於具有數據分割元數據的數據表,這可確保新增至數據表緩存器的新分割區會登錄至 Unity 目錄,而且針對數據表的查詢會讀取所有已註冊的數據分割。
針對讀取或寫入使用路徑型模式,可能會導致分割區遭到忽略或未註冊至 Unity 目錄中繼存放區。 請參閱限制。
列出分割區
使用下列命令,將已註冊至 Unity 目錄的所有分割區顯示為分割區元資料:
SHOW PARTITIONS <table-name>
若要檢查單一分割區是否已向 Unity 目錄註冊,請使用下列命令:
SHOW PARTITIONS <table-name>
PARTITION (<partition-column-name> = <partition-column-value>)
手動新增、卸除或修復分割區元數據
Unity 目錄要求外部數據表的所有分割區都包含在數據表註冊期間使用 LOCATION
子句註冊的目錄中。
啟用分區元資料後,會停用在資料表位置的分區自動偵測。 如果外部系統將數據寫入資料表位置,或使用路徑型寫入來新增或覆寫數據表中的記錄,您必須手動修復分割區元數據。
Azure Databricks 使用 Hive 樣式的數據分割來儲存 Parquet、ORC、CSV 和 JSON 支援的數據表。 Hive 樣式分區包含鍵值對,這些鍵值對是由分區目錄中的等號所連接,例如 year=2021/month=01/
。
如果您的數據表使用 Hive 樣式的數據分割,您可以使用 MSCK REPAIR
,將 Unity 目錄中的數據分割元數據與存在於數據表位置中的分割區同步處理。 下列語法範例示範一般作業:
-- Add and remove parition metadata to match directories in table location
MSCK REPAIR TABLE <table_name> SYNC PARTITIONS;
-- Add partitions in the table location that are not registered as partition metadata
MSCK REPAIR TABLE <table_name> ADD PARTITIONS;
-- Drop partitions registered as partition metadata that are not in the table location
MSCK REPAIR TABLE <table_name> DROP PARTITIONS;
請參閱 REPAIR TABLE。
手動指定其他分割區類型的路徑
如果您的數據表未使用 Hive 樣式的數據分割,您必須在新增資料分割時手動指定資料分割位置。 相較於 MSCK REPAIR
語法,手動指定分割區也可以降低延遲,特別是對於具有大量分割區的數據表。 下列語法範例示範新增分割區:
ALTER TABLE <table-name>
ADD PARTITION (<partition-column-name> = <partition-column-value>)
LOCATION 'abfss://<bucket-path>/<table-directory>/<partition-directory>';
您也可以使用 ALTER TABLE
語法來卸除、重新命名、復原及設定分割區的位置。 請參閱 ALTER TABLE... PARTITION。
停用新的分割區元數據
Spark 的設定會控制新數據表是否使用分割區元數據,而此設定預設是停用的。 您也可以明確停用此行為。 下列語法會使用 SQL 來停用 Spark conf:
SET spark.databricks.nonDelta.partitionLog.enabled = false;
這隻會控制在 SparkSession 中建立的數據表是否使用分割區元數據。 若要停用使用行為之數據表上的分割區元數據,您必須卸除並重新建立未啟用 Spark Conf 的 SparkSession 中的數據表。
注意
雖然在 Databricks Runtime 12.2 LTS 或更低版本中,您無法讀取或寫入啟用分區元數據的表格,但如果您在 Unity Catalog 中具有足夠的許可權,仍可以對這些表格執行 DROP
或 CREATE OR REPLACE TABLE
語句。
限制
存在下列限制:
- 您無法使用 Databricks Runtime 12.2 LTS 或以下版本來讀取或寫入已啟用資料分割元數據的數據表。
- 使用目錄路徑讀取資料表會傳回所有分區,包括任何已手動新增或刪除的資料分區。
- 如果您使用路徑插入或覆寫數據表中的記錄,而不是數據表名稱,則不會記錄數據分割元數據。
- 不支援 Avro 檔案格式。