共用方式為


使用 Unity Catalog 和舊版 Hive Metastore

本文說明當您的 Azure Databricks 工作區已啟用 Unity Catalog 時,如何繼續使用每個工作區的 Hive 中繼存放區的方法。

如果您的工作區在啟用 Unity Catalog 之前已經在使用中,它可能具有內建的 Hive 中繼存放區,其中包含您想要繼續使用的資料。 Databricks 建議您使用 Hive 中繼存放區同盟,在 Unity 目錄中建立外部目錄,以鏡像 Hive 中繼存放區,最後移轉所有舊版工作負載以使用該外部目錄。 不過,如果您尚未開始 Hive Metastore 聯邦過程,您可以使用這篇文章來瞭解如何處理在舊版 Hive Metastore 中註冊的數據,以及在 Unity Catalog 中註冊的數據。

查詢 Unity 目錄中的 Hive 中繼存放區

Unity Catalog 資料中繼存放區具有附加特性,這表示它可以與 Azure Databricks 中每個工作區的 Hive 資料中繼存放區搭配使用。 Hive 中繼存放區會顯示為三層命名空間中稱為 hive_metastore 的最上層目錄。

例如,您可以使用下列表示法來參考舊版 Hive 中繼資料存放區中sales模式下名為sales_raw的資料表:

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 中繼存放區的存取控制原則則會套用至工作區本機群組。 請參閱 Azure Databricks中的 群組類型。
  • 許可權是對目錄和架構內物件進行操作所需的:不論使用者在資料表上的許可權為何,該使用者也必須擁有 父目錄的許可權以存取架構,以及擁有 存取架構內物件的許可權。 另一方面,使用工作區層級資料表存取控制時,對根目錄授予 USAGE 會自動對所有資料庫授予 USAGE,但對根目錄則無須進行 USAGE 授權。
  • 檢視: 在 Unity Catalog 中,檢視擁有者不需要是其所參考的資料表和檢視的擁有者。 擁有 SELECT 許可權是足夠的,同時還需要在檢視表的父架構 USE SCHEMA 及父目錄 USE CATALOG 上的許可權。 使用工作區層級資料表存取控制時,檢視的擁有者必須是所有參考資料表和檢視的擁有者。
  • 在 Unity Catalog 中不支援ANY FILEANONYMOUS FUNCTION :在此目錄中,沒有ANY FILEANONYMOUS FUNCTION這類安全性實體的概念,這可能會允許不具特殊許可權的使用者運行具有特殊許可權的代碼。
  • 沒有 READ_METADATA 許可權:Unity 目錄會以不同方式管理檢視元數據的存取權。 請參閱Unity 目錄權限和安全物件

Unity Catalog 與 Hive Metastore 物件之間的連結

藉由使用三層命名空間表示法,您可以將 Unity Catalog 中繼存放區中的數據與舊版 Hive 中繼存放區中的數據聯結在一起。

注意

與舊版Hive中繼存放區中的數據聯結只能在該數據所在的工作區上運作。 嘗試在另一個工作區中執行這類聯結會導致錯誤。 Azure Databricks 建議您將 舊版數據表和檢視升級 至 Unity 目錄。

下列範例會在order_id欄位相等時,將來自於 legacy Hive 中繼存放區中的sales_current數據表與 Unity Catalog 中繼存放區中的sales_historical數據表進行聯結。

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 儲存體和 Blob 儲存體

將舊版數據表升級至 Unity 目錄

Hive MetaStore 中的資料表無法從 Unity Catalog 引入的全套安全性和治理功能中受益,例如內建稽核、資料血緣和存取控制。 Databricks 建議您使用 Hive 中繼存放區同盟,將 Hive 中繼存放區中註冊的數據遷移至 Unity 目錄,或 將舊版數據表直接新增至 Unity 目錄以進行升級