Unity Catalog と従来の Hive メタストアの使用
この記事では、Azure Databricks ワークスペースが Unity カタログに対して有効になっているときに、ワークスペースごとの Hive メタストアを引き続き使用するための 1 つの方法について説明します。
Unity カタログが有効になる前にワークスペースがサービスに入っていた場合は、引き続き使用するデータを含む組み込みの Hive メタストアが含まれている可能性があります。 Databricks では、Hive Metastore フェデレーション を使用して、Hive メタストアをミラー化するフェデレーション カタログを Unity カタログに作成し、最終的にすべてのレガシ ワークロードを移行してそのフェデレーション カタログを使用することをお勧めします。 ただし、Hive メタストアのフェデレーション プロセスをまだ開始していない場合は、この記事を使用して、Unity カタログに登録されているデータと共に、従来の Hive メタストアに登録されているデータを操作する方法を学習できます。
Unity Catalog で Hive メタストアに対してクエリを実行する
Unity Catalog メタストアは追加式のものです。つまり、Azure Databricks でワークスペースごとの Hive メタストアと一緒に使用できます。 Hive メタストアは、3 つのレベルの名前空間で 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 Catalog と Hive メタストアでのアクセス制御
Hive メタストア レガシ テーブルのアクセス制御 を構成した場合、Databricks は引き続き、共有アクセス モードで実行されているクラスターの hive_metastore
カタログ内のデータに対してこれらのアクセス制御を適用します。 Unity カタログ アクセス モデルは、従来のアクセス制御とは少し異なります (DENY
ステートメントがないなど)。 Hive メタストアはワークスペース レベルのオブジェクトです。 hive_metastore
カタログ内で定義されているアクセス許可は、常にワークスペース内のローカル ユーザーとグループを参照します。 従来のテーブル アクセス制御と比較した Unity カタログ特権モデルの
従来のテーブル アクセス制御と比較した Unity カタログ特権モデル
Unity カタログのアクセス制御モデルは、レガシ Hive メタストアのテーブル アクセス制御
- アカウントグループ: Unity Catalog のアクセスの制御ポリシーは、アカウントグループに適用されます。一方、Hive メタストアのアクセスの制御ポリシーは、ワークスペースのローカルグループに適用されます。 Azure Databricksでのグループの
の種類に関するページを参照してください。 - カタログまたはスキーマ内のオブジェクトに対するすべての操作には、カタログとスキーマに対する
USE CATALOG
とUSE SCHEMA
の権限が必要です:テーブルに対するプリンシパルの権限に関係なく、プリンシパルにはUSE CATALOG
、スキーマにアクセスするための親カタログに対する権限とUSE SCHEMA
スキーマ内のオブジェクトにアクセスする権限も必要です。 一方、ワークスペースレベルのテーブル アクセス制御では、ルー トカタログにUSAGE
を付与すると、すべてのデータベースに自動的にUSAGE
が付与されますが、ルート カタログにUSAGE
は必要ありません。 - ビュー: Unity Catalog では、ビューの所有者はビューの参照先のテーブルおよびビューの所有者である必要はありません。
SELECT
権限と、ビューの親スキーマに対するUSE SCHEMA
および 親カタログに対するUSE CATALOG
があれば十分です。 ワークスペースレベルのテーブル アクセス制御では、ビューの所有者が参照先のすべてのテーブルとビューの所有者である必要があります。 ANY FILE
またはANONYMOUS FUNCTION
のサポートなし: Unity カタログには、特権のないユーザーが特権コードを実行できる可能性があるANY FILE
やセキュリティ保護可能なANONYMOUS FUNCTION
の概念はありません。READ_METADATA
特権なし: Unity カタログは、メタデータを別の方法で表示するためのアクセスを管理します。 「Unity Catalog の権限とセキュリティ保護可能なオブジェクト」を参照してください。
Unity Catalog オブジェクトと Hive メタストア オブジェクト間の結合
3 つのレベルの名前空間表記を使用することで、従来の Hive メタストアのデータで Unity Catalog メタストアのデータを結合できます。
注意
従来の Hive メタストアのデータとの結合は、そのデータが存在するワークスペースでのみ機能します。 このような結合を別のワークスペースで実行しようとすると、エラーになります。 Azure Databricks では、従来のテーブルとビューを Unity Catalog にアップグレードすることをお勧めしています。
次に、sales_current
フィールドが等しい場合に、従来の Hive メタストアの sales_historical
テーブルと、Unity Catalog メタストアの order_id
テーブルを結合した結果の例を示します。
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 Catalog に対して有効になっているワークスペースごとに構成されます。
データ操作を実行するときに、最上位レベルのカタログ名を省略すると、既定のカタログが使われます。
ワークスペース用に最初に構成される既定のカタログは、Unity Catalog に対してワークスペースがどのように有効にされたかによって異なります。
- Unity Catalog に対してワークスペースが自動的に有効になっている場合は、ワークスペース カタログが既定のカタログとして設定されます。 「Unity Catalog の自動有効化」を参照してください。
- Unity Catalog に対してワークスペースが手動で有効にされた場合は、
hive_metastore
カタログが既定のカタログとして設定されます。
Hive メタストアから既存のワークスペース内の Unity カタログに移行する場合は、Hive メタストアから完全に移行していない限り、hive メタストアを参照する既存のコードに影響を与えないように、既定のカタログとして hive_metastore
を使用するのが理にかなっています。
既定のカタログを取得して切り替える方法については、既定のカタログの管理に関する記事を参照してください
クラスター スコープのデータ アクセス許可
Unity Catalog とともに Hive メタストアを使用する場合、クラスターに関連付けられているデータ アクセスの資格情報は、Unity Catalog に登録されているデータではなく、Hive メタストアのデータにアクセスするために使用されます。
ユーザーが Unity Catalog の外部にあるパス (テーブルまたは外部の場所として登録されていないパスなど) にアクセスする場合は、クラスターに割り当てられているアクセスの資格情報が使用されます。
「Azure Data Lake Storage Gen2 と Blob Storage に接続する」を参照してください。
Unity Catalog への従来のテーブルのアップグレード
Hive メタストア内のテーブルは、組み込みの監査、系列、アクセス制御など、Unity カタログが導入するセキュリティとガバナンスの機能の完全なセットの恩恵を受けません。 Databricks では、Hive メタストア フェデレーション