使用 Unity 目錄和舊版 Hive 中繼存放區
本文說明當您的 Azure Databricks 工作區已啟用 Unity Catalog 時,如何繼續使用每個工作區的 Hive 中繼存放區的方法。
如果您的工作區在啟用 Unity Catalog 之前已經在使用中,它可能具有內建的 Hive 中繼存放區,其中包含您想要繼續使用的資料。 Databricks 建議您使用 Hive 中繼存放區同盟 在 Unity 目錄中建立同盟目錄,以鏡像 Hive 中繼存放區,最後將所有舊版工作負載移轉至使用該同盟目錄。 不過,如果您尚未開始 Hive Metastore 聯邦過程,您可以使用這篇文章來瞭解如何處理在舊版 Hive Metastore 中註冊的數據,以及在 Unity Catalog 中註冊的數據。
查詢 Unity 目錄中的 Hive 中繼存放區
Unity 目錄中繼存放區是加總的,這表示它可以與 Azure Databricks 中的每個工作區 Hive 中繼存放區搭配使用。 Hive 中繼存放區會顯示為三層命名空間中稱為 hive_metastore
的最上層目錄。
例如,您可以使用下列表示法來參考舊版 Hive 中繼存放區架構中sales_raw
呼叫sales
的數據表:
SQL
SELECT * from hive_metastore.sales.sales_raw;
Python
display(spark.table("hive_metastore.sales.sales_raw"))
R
library(SparkR)
display(tableToDF("hive_metastore.sales.sales_raw"))
Scala
display(spark.table("hive_metastore.sales.sales_raw"))
您也可以使用 USE
語句來指定目錄和架構:
SQL
USE hive_metastore.sales;
SELECT * from sales_raw;
Python
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
R
library(SparkR)
sql("USE hive_metastore.sales")
display(tableToDF("sales_raw"))
Scala
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
Unity 目錄和Hive中繼存放區中的訪問控制
如果您在 Hive 中繼資料存放區上配置了 舊版資料表訪問控制,Databricks 將繼續對使用共用訪問模式運行的叢集中 hive_metastore
目錄內的資料強制執行這些訪問控制。 Unity 目錄存取模型與舊版訪問控制稍有不同,例如沒有 DENY
語句。 Hive 中繼存放區是工作區層級物件。 目錄中定義 hive_metastore
的許可權一律會參考工作區中的本機使用者和群組。 請參閱 Unity 目錄許可權模型,並將其與舊版數據表訪問控制進行比較。
Unity Catalog 權限模型與舊版資料表訪問控制的比較
在 Unity Catalog 中的存取控制模型與舊版 Hive 中繼資料庫中的 資料表存取控制 之間,有以下幾點不同:
- 帳戶群組: Unity 目錄中的存取控制原則會套用至帳戶群組,而 Hive 中繼存放區的存取控制原則則會套用至工作區本機群組。 請參閱 帳戶群組與工作區本地組之間的差異。
-
USE SCHEMA
內物件的所有作業都需要和許可權:不論主體在數據表上的許可權為何,主體也必須具有USE CATALOG
其父目錄的許可權,才能存取架構,以及USE SCHEMA
存取架構內對象的許可權。 另一方面,使用工作區層級資料表存取控制時,對根目錄授與USAGE
會自動對USAGE
授與所有資料庫,但不需要對根目錄進行USAGE
授權。 -
檢視: 在 Unity 目錄中,檢視的擁有者不需要是檢視參考資料表和檢視的擁有者。 擁有
SELECT
許可權就已足夠,以及USE SCHEMA
檢視表的父架構和USE CATALOG
父目錄。 使用工作區層級資料表存取控制時,檢視的擁有者必須是所有參考資料表和檢視的擁有者。 -
ANONYMOUS FUNCTION
:在 Unity 目錄中,沒有任何概念ANY FILE
或ANONYMOUS FUNCTION
安全性實體可能會允許不具特殊許可權的使用者執行特殊許可權程序代碼。 -
沒有
READ_METADATA
許可權:Unity 目錄會以不同方式管理檢視元數據的存取權。 請參閱Unity 目錄權限和安全物件。
Unity 目錄與Hive中繼存放區對象之間的聯結
藉由使用三層命名空間表示法,您可以將 Unity Catalog 中繼存放區中的數據與舊版 Hive 中繼存放區中的數據聯結在一起。
注意
與舊版Hive中繼存放區中的數據聯結只能在該數據所在的工作區上運作。 嘗試在另一個工作區中執行這類聯結會導致錯誤。 Azure Databricks 建議您將 舊版數據表和檢視升級 至 Unity 目錄。
下列範例會在sales_current
欄位相等時sales_historical
,聯結舊版 Hive 中繼存放區中的數據表與 order_id
Unity 目錄中繼存放區中的數據表。
SQL
SELECT * FROM hive_metastore.sales.sales_current
JOIN main.shared_sales.sales_historical
ON hive_metastore.sales.sales_current.order_id = main.shared_sales.sales_historical.order_id;
Python
dfCurrent = spark.table("hive_metastore.sales.sales_current")
dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
other = dfHistorical,
on = dfCurrent.order_id == dfHistorical.order_id
))
R
library(SparkR)
dfCurrent = tableToDF("hive_metastore.sales.sales_current")
dfHistorical = tableToDF("main.shared_sales.sales_historical")
display(join(
x = dfCurrent,
y = dfHistorical,
joinExpr = dfCurrent$order_id == dfHistorical$order_id))
Scala
val dfCurrent = spark.table("hive_metastore.sales.sales_current")
val dfHistorical = spark.table("main.shared_sales.sales_historical")
display(dfCurrent.join(
right = dfHistorical,
joinExprs = dfCurrent("order_id") === dfHistorical("order_id")
))
默認目錄
已針對針對 Unity 目錄啟用的每個工作區設定預設目錄。
如果您在執行資料作業時省略最上層目錄名稱,則會假設預設目錄。
最初為工作區設定的預設目錄取決於您針對 Unity 目錄啟用工作區的方式:
- 如果您的工作區已針對 Unity 目錄自動啟用,則 工作區目錄 已設定為預設目錄。 請參閱自動啟用 Unity 目錄。
- 如果您的工作區已手動為 Unity 目錄啟用,則
hive_metastore
目錄已設定為預設目錄。
如果您要在現有工作區中從 Hive 中繼存放區轉換至 Unity Catalog,建議使用 hive_metastore
作為預設目錄,這樣可以避免影響參考 Hive 中繼存放區的現有程式代碼,除非您已完全從 Hive 中繼存放區移轉。
若要瞭解如何取得和切換預設目錄,請參閱 管理預設目錄
叢集範圍的數據訪問許可權
當您搭配 Unity 目錄使用 Hive 中繼存放區時,會使用與叢集相關聯的數據存取認證來存取 Hive 中繼存放區數據,而不是在 Unity 目錄中註冊的數據。
如果使用者存取 Unity 目錄外部的路徑(例如未註冊為數據表或外部位置的路徑),則會使用指派給叢集的存取認證。
請參閱連線至 Azure Data Lake Storage Gen2 和 Blob 儲存體。
將舊版數據表升級至 Unity 目錄
Hive MetaStore 中的資料表無法從 Unity Catalog 引入的全套安全性和治理功能中受益,例如內建稽核、資料血緣和存取控制。 Databricks 建議您使用 Hive 中繼存放區同盟,將 Hive 中繼存放區中註冊的數據遷移至 Unity 目錄,或 將舊版數據表直接新增至 Unity 目錄以進行升級。