共用方式為


使用 Unity 目錄和舊版 Hive 中繼存放區

本文說明當您的 Azure Databricks 工作區已啟用 Unity 目錄時,如何使用個別工作區 Hive 中繼存放區。

如果您的工作區在針對 Unity 目錄啟用之前已在服務中,它可能會有 Hive 中繼存放區,其中包含您想要繼續使用的數據。 Databricks 建議您 將 Hive 中繼存放區所管理的數據表移轉至 Unity 目錄中繼存放區,但如果您選擇不移轉,本文說明如何使用這兩個中繼存放區所管理的數據。

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

Unity 目錄中繼存放區是加總的,這表示它可以與 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 目錄與在每個工作區的舊版 Hive 中繼存放區中使用 數據表訪問控制 有下列主要差異。

Unity 目錄中的存取控制模型與資料表存取控制有下列差異:

  • 帳戶群組: Unity 目錄中的存取控制原則會套用至帳戶群組,而 Hive 中繼存放區的存取控制原則則會套用至工作區本機群組。 請參閱 帳戶群組與工作區本地組之間的差異。
  • USE CATALOG目錄或架構內物件的所有作業都需要和USE SCHEMA許可權:不論主體在數據表上的許可權為何,主體也必須具有USE CATALOG其父目錄的許可權,才能存取架構,以及USE SCHEMA存取架構內對象的許可權。 另一方面,使用工作區層級資料表存取控制時,對根目錄授與 USAGE 會自動對 USAGE 授與所有資料庫,但不需要對根目錄進行 USAGE 授權。
  • 檢視: 在 Unity 目錄中,檢視的擁有者不需要是檢視參考資料表和檢視的擁有者。 擁有 SELECT 許可權就已足夠,以及 USE SCHEMA 檢視表的父架構和 USE CATALOG 父目錄。 使用工作區層級資料表存取控制時,檢視的擁有者必須是所有參考資料表和檢視的擁有者。
  • 不支援 ANY FILEANONYMOUS FUNCTION :在 Unity 目錄中,沒有任何概念ANY FILEANONYMOUS FUNCTION安全性實體可能會允許不具特殊許可權的使用者執行特殊許可權程序代碼。
  • 沒有 READ_METADATA 許可權:Unity 目錄會以不同方式管理檢視元數據的存取權。 請參閱 Unity 目錄許可權和安全性實體物件

Unity 目錄與Hive中繼存放區對象之間的聯結

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

注意

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

下列範例會在sales_current欄位相等時order_id,聯結舊版 Hive 中繼存放區中的數據表與 sales_historical 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 目錄,通常使用 做為預設目錄, hive_metastore 以避免影響參考 Hive 中繼存放區的現有程式代碼。

若要瞭解如何取得和切換預設目錄,請參閱 管理預設目錄

叢集範圍的數據訪問許可權

當您搭配 Unity 目錄使用 Hive 中繼存放區時,會使用與叢集相關聯的數據存取認證來存取 Hive 中繼存放區數據,而不是在 Unity 目錄中註冊的數據。

如果使用者存取 Unity 目錄外部的路徑(例如未註冊為數據表或外部位置的路徑),則會使用指派給叢集的存取認證。

請參閱 連線到 Azure Data Lake Storage Gen2 和 Blob 記憶體

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

Hive 中繼存放區中的數據表無法受益於 Unity 目錄引進的完整安全性和治理功能,例如內建稽核和訪問控制。 Databricks 建議您 將舊版數據表新增至 Unity 目錄,以升級舊版數據表