使用 Unity 目錄搭配差異即時資料表管線
重要
Unity 目錄的差異即時資料表支援處於公開預覽狀態。
Databricks 建議使用 Unity 目錄設定 Delta Live Tables 管線。
使用 Unity 目錄設定的管線會將所有已定義的具體化檢視和串流數據表發佈至指定的目錄和架構。 Unity 目錄管線可以從其他 Unity 目錄數據表和磁碟區讀取。
若要管理 Unity Catalog 管線所建立之資料表的權限,請使用 GRANT 和 REVOKE。
需求
從 Delta Live Tables 管線在 Unity 目錄中建立數據表所需的許可權:
-
USE CATALOG
目標目錄的許可權。 -
CREATE MATERIALIZED VIEW
USE SCHEMA
如果您的管線建立具體化檢視,則目標架構的許可權和許可權。 -
CREATE TABLE
USE SCHEMA
如果您的管線建立串流數據表,則為目標架構的許可權。 - 如果未在管線設定中指定目標結構描述,您必須在目標目錄的至少一個結構描述中擁有
CREATE MATERIALIZED VIEW
或CREATE TABLE
權限。
執行已啟用 Unity 目錄的管線所需的計算:
- 共用存取模式叢集。 已啟用 Unity 目錄的管線無法在單一使用者 (“assigned”) 叢集上執行。 請參閱 Unity 目錄上的共用存取模式限制。
使用 Unity 目錄查詢 Delta Live Tables 管線所建立之數據表所需的計算(包括串流數據表和具體化檢視表)包含下列任一項:
SQL 倉儲
Databricks Runtime 13.3 LTS 或更新版本上的共用存取模式叢集。
如果在單一使用者叢集上啟用微調訪問控制,則單一使用者(或「已指派」)存取模式叢集(也就是叢集是在 Databricks Runtime 15.4 或更新版本上執行,且已啟用工作區的無伺服器計算)。 如需詳細資訊,請參閱 單一用戶計算的精細訪問控制。
只有在數據表擁有者執行查詢時,13.3 LTS 到 15.3 上的單一使用者(或「已指派」)存取模式叢集。
套用額外的計算限制。 請參閱後續章節。
限制
搭配使用 Unity Catalog 與 Delta Live Tables 時,有下列限制:
根據預設,只有管線擁有者和工作區管理員可以從執行已啟用 Unity 目錄之管線的叢集檢視驅動程序記錄。 若要允許其他使用者存取驅動程序記錄,請參閱 允許非系統管理員使用者從已啟用 Unity 目錄的管線檢視驅動程序記錄。
使用 Hive 中繼存放區的現有管線無法升級為使用 Unity Catalog。 若要移轉寫入到 Hive 中繼存放區的現有管線,您必須建立新的管線,並從資料來源中重新內嵌資料。
您無法在附加至 Unity 目錄公開預覽期間所建立中繼存放區的工作區中建立已啟用 Unity 目錄的管線。 請參閱升級至權限繼承。
不支援 JAR。 僅支援第三方 Python 連結庫。 請參閱管理 Delta Live Tables 管線的 Python 相依性。
不支援修改串流資料表結構描述的資料操作語言 (DML) 查詢。
在 Delta Live Tables 管線中建立的具體化檢視無法當做該管線外部的串流來源使用,例如在另一個管線或下游筆記本中。
如果管線發行至具有受控儲存位置的結構描述,則可以在後續更新中變更該結構描述,但前提是更新後的結構描述使用與先前指定之結構描述相同的儲存位置。
數據表會儲存在目標架構的儲存位置。 如果未指定架構儲存位置,數據表會儲存在目錄儲存位置。 如果未指定架構和目錄儲存位置,數據表會儲存在中繼存放區的根記憶體位置。
[目錄總 管歷程記錄 ] 索引標籤不會顯示具體化檢視的歷程記錄。
定義資料表時不支援
LOCATION
屬性。已啟用 Unity Catalog 的管線無法發佈至 Hive 中繼存放區。
Python UDF 支援處於公開預覽狀態。
您無法搭配使用 Delta Sharing 與發佈至 Unity Catalog 的 Delta Live Tables 具體化檢視或串流資料表。
您無法在管線或查詢中使用
event_log
資料表值函式來存取多個管線的事件記錄。您無法與其他使用者共用透過
event_log
資料表值函式建立的檢視。已啟用 Unity Catalog 的管線不支援單一節點叢集。 因為 Delta Live Tables 可能會建立單一節點叢集來執行較小的管線,因此您的管線可能會失敗,並出現引用
single-node mode
的錯誤訊息。 如果發生這種情況,請在設定計算時至少指定一個背景工作角色。 請參閱 設定 Delta Live Tables 管線的計算。
注意
支援具體化檢視的基礎檔案可能包含上游資料表的資料 (包括可能的個人識別資訊),它們不會出現在具體化檢視定義中。 此資料會自動新增至基礎儲存體,以支援具體化檢視的累加式重新整理。
由於具體化檢視的基礎檔案可能會公開不屬於具體化檢視結構描述的上游資料表的資料,因此 Databricks 建議不要與不受信任的下游取用者共用基礎儲存體。
例如,假設具體化檢視定義包含 COUNT(DISTINCT field_a)
子句。 即使具體化檢視定義只包含彙總 COUNT DISTINCT
子句,基礎檔案仍會包含 field_a
的實際值清單。
我可以在一起使用Hive中繼存放區和Unity目錄管線嗎?
您的工作區可以包含使用 Unity 目錄和舊版 Hive 中繼存放區的管線。 不過,單一管線無法寫入 Hive 中繼存放區和 Unity 目錄。 寫入Hive中繼存放區的現有管線無法升級為使用 Unity 目錄。
使用 Unity 目錄的現有管線不會受到影響,方法是建立以 Unity 目錄設定的新管線。 這些管線會使用設定的儲存位置,繼續將數據保存到Hive中繼存放區。
除非在本文件中另有指定,否則使用 Unity Catalog 的管線可支援所有現有的資料來源和 Delta Live Tables 功能。 使用 Unity Catalog 的管線支援 Python 和 SQL 介面。
現有功能的變更
當 Delta Live Tables 設定為將資料保存到 Unity Catalog 時,資料表的生命週期將完全受控於 Delta Live Tables 管線。 因為管線會管理資料表生命週期與權限:
- 從 Delta Live Tables 管線定義移除資料表時,下一個管線更新會從 Unity Catalog 中移除對應的具體化檢視或串流資料表項目。 實際數據會保留一段時間,以便在錯誤刪除時加以復原。 您可以將具體化檢視或串流數據表新增回管線定義,以復原數據。
- 刪除 Delta Live Tables 管線會導致刪除該管線中定義的所有數據表。 由於這項變更,差異實時數據表 UI 會更新,提示您確認刪除管線。
- 用戶無法直接存取內部支持數據表,包括用來支援的內部支持
APPLY CHANGES INTO
數據表。
將資料表從 Delta Live Tables 管線寫入到 Unity Catalog
注意
如果您未選取管線的目錄和目標結構描述,資料表不會發佈至 Unity Catalog,而且只能由相同管線中的查詢進行存取。
若要將資料表寫入 Unity 目錄,您必須將管線設定為透過工作區加以使用。 當您建立管線時,請選取 [記憶體選項] 下的 [Unity 目錄],在 [目錄] 下拉功能表中選取目錄,然後選取現有的架構,或在 [目標架構] 下拉功能表中輸入新架構的名稱。 若要進一步了解 Unity Catalog 目錄,請參閱什麼是 Azure Databricks 中的目錄?。 若要進一步了解 Unity Catalog 中的結構描述,請參閱什麼是 Azure Databricks 中的結構描述?。
將資料內嵌至 Unity Catalog 管線
設定為使用 Unity Catalog 的管線可以從下列項目讀取資料:
- Unity Catalog 管理的資料表和外部資料表、檢視、具體化檢視和串流資料表。
- Hive 中繼存放區資料表和檢視。
- 使用
read_files()
函式從 Unity Catalog 外部位置進行讀取的自動載入器。 - Apache Kafka 和 Amazon Kinesis。
以下是從 Unity Catalog 和 Hive 中繼存放區資料表進行讀取的範例。
從 Unity Catalog 資料表進行批次擷取
SQL
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
my_catalog.my_schema.table1;
Python
@dlt.table
def table_name():
return spark.read.table("my_catalog.my_schema.table")
從 Unity Catalog 資料表串流變更
SQL
CREATE OR REFRESH STREAMING TABLE
table_name
AS SELECT
*
FROM
STREAM(my_catalog.my_schema.table1);
Python
@dlt.table
def table_name():
return spark.readStream.table("my_catalog.my_schema.table")
從 Hive 中繼存放區內嵌資料
使用 Unity Catalog 的管線可以使用 hive_metastore
目錄從 Hive 中繼存放區資料表讀取資料:
SQL
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
hive_metastore.some_schema.table;
Python
@dlt.table
def table3():
return spark.read.table("hive_metastore.some_schema.table")
從自動載入器擷取資料
SQL
CREATE OR REFRESH STREAMING TABLE
table_name
AS SELECT
*
FROM
read_files(
<path-to-uc-external-location>,
"json"
)
Python
@dlt.table(table_properties={"quality": "bronze"})
def table_name():
return (
spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json")
.load(f"{path_to_uc_external_location}")
)
共用具體化檢視
根據預設,只有管線擁有者有權查詢管線所建立的數據集。 您可以讓其他使用者透過使用 GRANT 陳述式來查詢資料表,而且您可以使用 REVOKE 陳述式撤銷查詢存取權。 如需 Unity Catalog 中權限的詳細資訊,請參閱管理 Unity Catalog 中的權限。
在資料表中授與選取權限
GRANT SELECT ON TABLE
my_catalog.my_schema.table_name
TO
`user@databricks.com`
在資料表中撤銷選取權限
REVOKE SELECT ON TABLE
my_catalog.my_schema.table_name
FROM
`user@databricks.com`
授與建立資料表或建立具體化檢視權限
GRANT CREATE { MATERIALIZED VIEW | TABLE } ON SCHEMA
my_catalog.my_schema
TO
{ principal | user }
檢視管線的譜系
Delta Live Tables 管線中資料表的譜系會顯示在目錄總管中。 目錄總管歷程 UI 會顯示在已啟用 Unity 目錄之管線中具體化檢視或串流數據表的上游和下游數據表。 若要深入了解 Unity Catalog 譜系,請參閱使用 Unity Catalog 擷取和檢視資料譜系。
對於已啟用 Unity Catalog 之 Delta Live Tables 管線中的具體化檢視或串流資料表,如果可從目前工作區存取管線,則目錄總管譜系 UI 也會連結到生成具體化檢視或串流資料表的管線。
在串流資料表中新增、變更或刪除資料
您可以使用 資料操作語言 (DML) 語句,包括插入、更新、刪除和合併語句,修改發行至 Unity 目錄的串流數據表。 對串流數據表的 DML 查詢支援可啟用使用案例,例如更新數據表以符合一般數據保護規定(GDPR)。
注意
- 不支援修改串流資料表之資料表結構描述的 DML 陳述式。 請確定您的 DML 陳述式不會嘗試演進資料表結構描述。
- 更新串流資料表的 DML 陳述式只能在共用的 Unity Catalog 叢集或 SQL 倉儲中使用 Databricks Runtime 13.3 LTS 和更新版本來執行。
- 因為串流需要「僅附加」資料來源,如果您的處理需要從具有變更的來源串流資料表進行串流處理 (例如透過 DML 陳述式),請在讀取來源串流資料表時設定 skipChangeCommits 旗標。 設定
skipChangeCommits
時,會忽略刪除或修改來源資料表中記錄的交易。 如果您的處理不需要串流資料表,則可以使用具體化檢視 (沒有「僅附加」限制) 作為目標資料表。
以下是 DML 陳述式的範例,可用來修改串流資料表中的記錄。
刪除具有特定 ID 的記錄:
DELETE FROM my_streaming_table WHERE id = 123;
更新具有特定 ID 的記錄:
UPDATE my_streaming_table SET name = 'Jane Doe' WHERE id = 123;
發行具有資料列篩選和資料行遮罩的資料表
重要
這項功能處於公開預覽狀態。
每當資料表掃描擷取資料列時,資料列篩選可讓您指定套用為篩選條件的函式。 這些篩選條件可確保後續查詢只會傳回篩選條件述詞評估為 true 的資料列。
每當資料表掃描擷取資料列時,資料行遮罩可讓您遮罩資料行的值。 該資料行的未來查詢會傳回已評估函式的結果,而非資料行的原始值。 如需使用數據列篩選和數據行遮罩的詳細資訊,請參閱 使用數據列篩選和數據行遮罩篩選敏感數據。
管理資料列篩選和資料行遮罩
應該透過 CREATE OR REFRESH
陳述式來新增、更新或卸除具體化檢視和串流資料表上的資料列篩選和資料行遮罩。
如需使用數據列篩選和數據行掩碼定義數據表的詳細語法,請參閱 Delta Live Tables SQL 語言參考 和 Delta Live Tables Python 語言參考。
行為
以下是在 Delta Live Tables 管線中使用資料列篩選或資料行遮罩時的重要詳細資料:
-
以擁有者身分重新整理:當管線更新重新整理具體化檢視或串流資料表時,資料列篩選和資料行遮罩函式會以管線擁有者的權限執行。 這表示資料表重新整理會使用建立管線之使用者的安全性內容。 使用管線擁有者的使用者內容來評估檢查使用者內容的函式 (例如
CURRENT_USER
和IS_MEMBER
)。 -
查詢:查詢具體化檢視或串流資料表時,會使用叫用者的使用者內容來評估檢查使用者內容的函式 (例如
CURRENT_USER
和IS_MEMBER
)。 此方法會根據目前使用者的內容強制執行使用者特定的資料安全性和存取控制。 - 在包含資料列篩選和資料行遮罩的來源資料表上建立具體化檢視時,具體化檢視的重新整理始終是完全重新整理。 完全重新整理會使用最新的定義重新處理來源中所有可用的資料。 此程序可檢查是否已使用最新的資料和定義來評估並套用來源資料表上的安全性原則。
可檢視性
使用 DESCRIBE EXTENDED
、 INFORMATION_SCHEMA
或目錄總管來檢查套用至指定具體化檢視或串流數據表的現有數據列篩選和數據行遮罩。 此功能可讓使用者稽核和檢閱具體化檢視和串流資料表的資料存取和保護措施。