次の方法で共有


Unity カタログと共に従来の Hive メタストアを操作する

この記事では、Azure Databricks ワークスペースが Unity カタログに対して有効になっている場合に、ワークスペースごとのレガシ Hive メタストアを引き続き使用する方法の 1 つについて説明します。

Unity カタログが有効になる前にワークスペースがサービスに入っていた場合は、引き続き使用する可能性のあるデータを含む Hive メタストアが存在する可能性があります。 この記事では、Hive メタストアに登録されているテーブルを引き続き操作する方法について説明します。

重要

ワークスペースごとの Hive メタストアは従来の機能であり、この記事で説明する手順は従来のワークフローを表しています。

Hive メタストアのテーブルは、組み込みの監査、系列、アクセス制御など、Unity カタログによって提供されるセキュリティおよびガバナンス機能の完全なセットの恩恵を受けません。 Databricks では、それらのテーブルと、それらを参照するワークロードを Unity カタログに移行し、Hive メタストアへの直接アクセスを無効にすることをお勧めします。

次の 2 つの移行パスを使用できます。

  • Hive メタストアに登録されているすべてのテーブルを Unity カタログにアップグレードします。

  • より段階的なアプローチのために、Hive メタストアフェデレーションを使用して Hive メタストア を Unity カタログにフェデレーションします。 Hive メタストア フェデレーションは、Hive メタストアをミラー化する外部カタログを Unity カタログに作成します。

「Azure Databricks ワークスペースを Unity カタログにアップグレードする」を参照してください。

Unity カタログのレガシ 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"))

スカラ (プログラミング言語)

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"))

スカラ (プログラミング言語)

spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))

従来の Hive メタストアと比較した Unity カタログでのアクセス制御

Hive メタストアで レガシ テーブルのアクセス制御 を構成した場合、Databricks は引き続き、標準アクセス モードで実行されているクラスターの hive_metastore カタログ内のデータに対してこれらのアクセス制御を適用します。

Unity カタログ アクセス モデルは、従来のアクセス制御とは若干異なります。

  • メタストア: Unity カタログはアカウント レベルのオブジェクトであり、Hive メタストアはワークスペース レベルのオブジェクトです。 hive_metastore カタログ内で定義されているアクセス許可は、常にワークスペース内のローカル ユーザーとグループを参照します。
  • アカウントグループ: Unity Catalog のアクセスの制御ポリシーは、アカウントグループに適用されます。一方、Hive メタストアのアクセスの制御ポリシーは、ワークスペースのローカルグループに適用されます。 グループ ソースを参照してください。
  • カタログまたはスキーマ内のオブジェクトに対するすべての操作に対して、カタログとスキーマに対するUSE CATALOGおよびUSE SCHEMA権限が必要です。テーブルに対するプリンシパルの権限に関係なく、プリンシパルには、スキーマにアクセスするための親カタログに対するUSE CATALOG権限と、スキーマ内のオブジェクトにアクセスするためのUSE SCHEMA権限も必要です。 一方、ワークスペースレベルのテーブル アクセス制御では、ルー トカタログに USAGE を付与すると、すべてのデータベースに自動的に USAGE が付与されますが、ルート カタログに USAGE は必要ありません。
  • ビュー: Unity カタログでは、ビューの所有者がビューの参照先テーブルとビューの所有者である必要はありません。 SELECT特権があれば十分です。さらに、ビューの親スキーマについてのUSE SCHEMAと、親カタログについてのUSE CATALOGが必要です。 ワークスペース レベルのテーブル アクセス制御では、ビューの所有者が、参照されているすべてのテーブルとビューの所有者である必要があります。
  • ANY FILE または ANONYMOUS FUNCTION のサポートなし: Unity カタログには、特権のないユーザーが特権コードを実行できる可能性がある ANY FILE やセキュリティ保護可能な ANONYMOUS FUNCTION の概念はありません。
  • DENYのサポートなし: Unity カタログ特権モデルは、最小特権の原則に基づいて構築されています。 付与されていない特権は暗黙的に拒否されます。
  • 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))

スカラ (プログラミング言語)

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 と Blob Storage への接続」を参照してください。