外部數據表的數據分割探索
本文說明 Unity 目錄外部數據表的預設數據分割探索策略,以及啟用數據分割元數據記錄的選擇性設定,讓數據分割探索與 Hive 中繼存放區一致。
Databricks 建議針對具有數據分割的 Unity 目錄外部數據表啟用數據分割元數據記錄,以改善讀取速度和查詢效能。
Unity 目錄的預設分割區探索策略為何?
根據預設,Unity 目錄會以遞歸方式列出數據表位置中的所有目錄,以自動探索分割區。 對於具有許多數據分割目錄的大型數據表,這可能會增加許多數據表作業的延遲。
使用分割區元數據記錄
重要
這項功能處於公開預覽狀態。
在 Databricks Runtime 13.3 LTS 和更新版本中,您可以選擇性地啟用數據分割元數據記錄,這是註冊至 Unity 目錄的外部數據表的數據分割探索策略。 此行為與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 目錄的數據表使用所有讀取和寫入中的數據表名稱。 對於具有數據分割元數據的數據表,這可確保新增至數據表緩存器的新分割區會登錄至 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 目錄中有足夠的許可權,您可以對這些數據表執行 DROP
或 CREATE OR REPLACE TABLE
語句。
限制
存在下列限制:
- 您無法使用 Databricks Runtime 12.2 LTS 或以下版本來讀取或寫入已啟用資料分割元數據的數據表。
- 使用目錄路徑讀取數據表會傳回所有分割區,包括任何已手動新增或卸除的數據分割。
- 如果您使用路徑插入或覆寫數據表中的記錄,而不是數據表名稱,則不會記錄數據分割元數據。
- 不支援 Avro 檔案格式。