Unity Catalog 管理的資料表是 Azure Databricks 中 Delta Lake 和 Apache Iceberg 的預設且推薦的資料表類型。 Unity Catalog 負責管理所有的讀寫、儲存與優化責任。 請參見「將外部或外來 Delta Lake 資料表轉換為 Unity Catalog 受控資料表」。
管理的資料表的資料檔會儲存在包含這些資料表的架構或目錄中。 請參閱 在 Unity 目錄中指定受控儲存位置。
與 外部 及 外部 資料表相比,管理式資料表在儲存與查詢、自動維護與優化,並透過開放 API 保持外部客戶存取的成本較低。
您可以跨 Azure Databricks 支援的所有語言和產品,使用受控數據表。 您需要特定許可權,才能建立、更新、刪除或查詢受控數據表。 請參閱 在 Unity 目錄中管理許可權。
Note
本頁僅描述 Unity 目錄管理的資料表。 如需舊版Hive中繼存放區中的受控數據表,請參閱 舊版Hive中繼存放區中的資料庫物件。
Unity 目錄管理資料表的優點
Unity Catalog 管理的表格優化儲存成本與查詢速度,並允許與第三方工具的 Delta Lake 與 Apache Iceberg 互通。 為了簡化資料管理與效能,這些管理資料表採用 AI 技術,如檔案大小壓縮與智慧統計收集。
受管理資料表透過允許 Delta Lake 與 Apache Iceberg 用戶端存取,支援互通性。 請參閱 使用外部系統存取 Databricks 的資料。
以下功能為 Unity Catalog 受管理資料表所獨有,不適用於外部資料表和外來資料表:
| Feature | Benefits | Configuration |
|---|---|---|
| 目錄提交 | 支援跨資料表的 多語句交易 、更快的查詢規劃、可強制執行的結構與約束變更,以及外部引擎的安全寫入。 | 預設為關閉。 若要啟用,請設定 delta.feature.catalogManaged table 屬性。 請參見啟用目錄提交。 |
| 預測性優化 | 自動利用 AI 優化資料配置與運算,無需人工維護作業。 Databricks 建議針對所有受控資料表啟用預測優化,以降低儲存體和計算成本。 | 預設啟用於 2024 年 11 月 11 日或之後建立的帳號。 Azure Databricks 正在逐步為現有帳戶啟用此功能。 要進行設定,請參見 「啟用預測優化」。 |
| 多陳述式交易 | 在一個或多個資料表上執行多個 SQL 語句,作為一個原子提交,並有 ACID 保證。 所有變更要麼一起成功,要麼一起回滾。 用於 儲存程序 與 SQL 腳本。 | 預設為關閉。 要選擇交易模式,請參見 交易模式。 |
| 自動液體聚集 | 對於具備 預測優化的資料表,會隨著查詢模式改變自動選擇並更新群集鍵,以提升效能並降低成本。 | 預設為關閉。 要設定,請參見 啟用液體聚類。 |
| 中繼資料快取 | 交易中繼資料的記憶體快取透過減少對雲端交易日誌的請求,提升查詢效能。 | 默認為啟用。 無法設定。 |
| 全文搜尋索引 | 利用 search and isearch 函式加速文本欄位的子字串與關鍵字查詢。 Azure Databricks 會跳過無法包含相符資料列的檔案,減少掃描的資料量。 |
預設為關閉。 用 CREATE SEARCH INDEX建立 。在 測試階段。 需要 Databricks Runtime 18.2 及以上版本。 |
命令後 DROP TABLE 自動刪除檔案 |
當你丟棄管理資料表時,Azure Databricks 會在恢復期(預設 7 天)過後刪除雲端儲存中的資料檔案,降低儲存成本。 對於外部資料表,你必須手動從儲存桶中刪除檔案。 | 默認為啟用。 你可以在目錄或架構層級設定復原期間。 請參閱 刪除受管理資料表。 |
透過外部系統存取 Databricks 資料
受管理資料表可讓 Delta Lake 和 Apache Iceberg 用戶端存取,藉此支援互通性。
透過開放 API 與憑證自動服務,Unity Catalog 使外部引擎如 Trino、DuckDB、Apache Spark、Daft 及 Iceberg REST 目錄整合引擎(如 Dremio)能存取受管理資料表。 對於不支援開放 API 的外部用戶端,你可以使用 相容模式 來讀取任何 Delta Lake 或 Apache Iceberg 用戶端的受管理資料表。 OpenSharing 是一個開放原始碼協議,能與外部合作夥伴及平台安全且受規範的資料共享。
請參閱整合以取得支援的外部引擎清單,若未包含在此清單中,請檢查引擎的說明文件。
以下開放 API 允許外部系統存取 Unity 目錄管理的資料表:
- Unity REST API 為 Delta Lake 用戶端提供對受管理 Delta Lake 資料表的讀寫與建立存取權限。
- Iceberg REST 目錄(IRC) 為 Apache Iceberg 用戶端提供對管理資料表的讀寫與建立存取權限,並啟用 Apache Iceberg 讀取功能時,對 Delta Lake 資料表提供唯讀存取權限。
這兩個 API 都支援 認證發放,這會提供臨時的範疇認證,以繼承請求 Azure Databricks 主體的權限,維持治理功能和安全性控制。
OpenSharing 是一種開放原始碼協議,允許外部合作夥伴與平台安全且受規範地存取資料。 你可以使用 OpenSharing 授權合作夥伴臨時且唯讀的存取權限。
所有對受管理資料表的讀取和寫入都必須使用資料表名稱以及目錄和結構描述名稱(如果它們存在)。 例如: catalog_name.schema_name.table_name 。 不支援對 Unity 目錄受控資料表的路徑型存取 ( 相容模式除外),因為它會略過 Unity 目錄存取控制,並防止受控資料表功能正常運作。
建立受控資料表
若要建立管理資料表,您必須具備:
-
USE SCHEMA在數據表的父架構上。 -
USE CATALOG在資料表的父目錄上。 -
CREATE TABLE在數據表的父架構上。
請使用以下語法建立一個空的受管理資料表。 替換占位符值:
-
<catalog-name>:將包含資料表的目錄名稱。 -
<schema-name>:包含數據表的架構名稱。 -
<table-name>:數據表的名稱。 -
<column-specification>:每個數據行的名稱和數據類型。
SQL
-- Create a managed Delta table
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
<column-specification>
);
-- Create a managed table using Iceberg
CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
<column-specification>
)
USING iceberg;
Python
請使用以下工具 saveAsTable()建立一個受管理的三角洲湖資料表:
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType([StructField("<column-name>", StringType())])
spark.createDataFrame([], schema).write \
.saveAsTable("<catalog-name>.<schema-name>.<table-name>")
或者,使用 DeltaTableBuilder API 來處理 Delta 專屬的選項,例如產生的欄位和資料表屬性:
from delta.tables import DeltaTable
DeltaTable.create(spark) \
.tableName("<catalog-name>.<schema-name>.<table-name>") \
.addColumn("<column-name>", "<data-type>") \
.property("<key>", "<value>") \
.execute()
使用 Apache Iceberg 建立一個受管理的資料表:
from pyspark.sql.types import StructType, StructField, StringType
schema = StructType([StructField("<column-name>", StringType())])
spark.createDataFrame([], schema).write \
.format("iceberg") \
.saveAsTable("<catalog-name>.<schema-name>.<table-name>")
為了維持讀寫效能,Azure Databricks 會定期執行操作,利用 Apache Iceberg 優化受管理資料表的元資料。 此任務使用無伺服器運算執行,該運算在資料表上擁有 MODIFY 權限。 此操作只寫入資料表的元數據,計算系統只在操作期間管理資料表的權限。
Note
要建立 Apache Iceberg 表格,請明確指定 USING iceberg。 否則,Azure Databricks 預設會建立 Delta Lake 數據表。
您可以從查詢結果或 DataFrame 寫入作業建立受控數據表。 下列文章示範一些可用來在 Azure Databricks 上建立受控數據表的模式:
若要建立現有受管理資料表的複製品,請使用 clone。 管理型三角洲湖表支援深層與淺層克隆。 使用 Apache Iceberg 的管理資料表僅支援深度克隆。 請參閱 在 Azure Databricks 上複製資料表以及 複製使用 Iceberg 的受控資料表。
刪除受控資料表
若要刪除受管理的資料表,您必須具有:
-
MANAGE在數據表上,或者您必須是數據表擁有者。 -
USE SCHEMA在數據表的父架構上。 -
USE CATALOG在資料表的父目錄上。
要丟棄受管理資料表,請執行以下指令:
SQL
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
Python
spark.sql("DROP TABLE IF EXISTS catalog_name.schema_name.table_name")
或者,在 Databricks Runtime 18.2 及以上版本中,請使用 spark.catalog.dropTable():
spark.catalog.dropTable("catalog_name.schema_name.table_name", ifExists=True)
Unity Catalog 支援 UNDROP TABLE 恢復意外遺失的管理資料表指令。 預設情況下,資料表在被丟棄後可恢復 7 天。 復原期結束後,非同步清除程序會從你的雲端租戶中刪除底層資料檔案。
設定復原期間
Important
可設定的復原期間目前處於 公開預覽 階段。
你可以設定被丟棄的管理資料表在目錄或架構層級可恢復的時間長短。 若恢復期間同時設定於兩個層級,則該架構中的資料表將優先採用結構層級設定。
要設定復原期間,您必須對目錄或架構擁有 MANAGE 權限或所有權。 此設定僅適用於設定後丟棄的資料表。 它不會影響已經被刪除的資料表。
恢復期可以是0小時,導致恢復失效,也可以是7到30天。 較長的期間可防止關鍵資料意外遺失,而較短的刪除則能更快刪除掉落的資料,以節省經常建立與丟棄資料表的 ETL 管線中的儲存成本。 當設定為 0 時,遺失的資料表無法用 來恢復。UNDROP 非同步清除程序會在執行 drop 作業後,從雲端儲存中刪除資料檔案。
要設定恢復期間,請使用 ALTER CATALOG 或 ALTER SCHEMA 與以下 RETAIN DROPPED TO 條款一起:
SQL
-- Set a 30-day recovery period on a catalog
ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS;
-- Set a 7-day recovery period on a schema (overrides the catalog setting)
ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS;
Python
spark.sql("ALTER CATALOG my_catalog RETAIN DROPPED TO 30 DAYS")
spark.sql("ALTER SCHEMA my_catalog.my_schema RETAIN DROPPED TO 7 DAYS")
你也可以在建立目錄或結構時,使用以下 RETAIN DROPPED FOR 條款設定恢復期間:
SQL
CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS;
CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS;
Python
spark.sql("CREATE CATALOG my_catalog RETAIN DROPPED FOR 30 DAYS")
spark.sql("CREATE SCHEMA my_catalog.my_schema RETAIN DROPPED FOR 7 DAYS")
要檢查目前的恢復週期,請執行 DESCRIBE EXTENDED。 輸出包含一 Recovery Period Hours 列:
SQL
DESCRIBE CATALOG EXTENDED my_catalog;
DESCRIBE SCHEMA EXTENDED my_catalog.my_schema;
Python
spark.sql("DESCRIBE CATALOG EXTENDED my_catalog").show()
spark.sql("DESCRIBE SCHEMA EXTENDED my_catalog.my_schema").show()