Unity Catalog とレガシー Hive metastore を操作する

この記事では、Databricks ワークスペースで Unity Catalog が有効になっている場合に、ワークスペースごとの Hive metastore を使用する方法について説明します。

Unity Catalogが有効になる前にワークスペースが稼働していた場合は、引き続き使用するデータを含む Hive metastore が含まれている可能性があります。Databricks では、 Hive metastore によって管理されるテーブルを Unity Catalog メタストアに移行することをお勧めしますが、移行しない場合は、両方の メタストアによって管理される データを操作する方法について説明します。

Unity Catalog における Hive metastore へのクエリ

Unity Catalog メタストアは付加的であり、Databricks のワークスペースごとの Hive metastore で使用できます。Hive metastore は、3 レベルの名前空間に hive_metastore という最上位のカタログとして表示されます。

たとえば、次の表記を使用して、レガシ Hive metastore の sales スキーマで sales_raw というテーブルを参照できます。

SELECT * from hive_metastore.sales.sales_raw;
display(spark.table("hive_metastore.sales.sales_raw"))
library(SparkR)

display(tableToDF("hive_metastore.sales.sales_raw"))
display(spark.table("hive_metastore.sales.sales_raw"))

カタログとスキーマを USE ステートメントで指定することもできます。

USE hive_metastore.sales;
SELECT * from sales_raw;
spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))
library(SparkR)

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

Unity Catalog および Hive metastore におけるアクセス制御

Hivemetastore で テーブルアクセスコントロール を構成した場合、Databricks は、共有アクセス モードで実行されているクラスターの カタログ内のデータに対してこれらのアクセス制御を引き続き適用します。 hive_metastore Unity Catalog アクセス モデルは、 DENY ステートメントがないなどの従来のアクセス制御とは若干異なります。Hive metastore はワークスペースレベルのオブジェクトです。hive_metastore カタログ内で定義されたアクセス許可は、常にワークスペース内のローカル ユーザーとグループを参照します。「テーブルアクセスコントロールとの違い」を参照してください。

テーブルアクセスコントロールとの違い

Unity Catalog には、各ワークスペースのレガシ Hive metastore で テーブルアクセスコントロール を使用する場合と次の主な違いがあります。

Unity Catalog のアクセス制御モデルには、テーブルアクセスコントロールと次の違いがあります。

  • アカウント グループ: Unity Catalogのアクセス制御ポリシーはアカウント グループに適用され、 Hive metastoreのアクセス制御ポリシーはワークスペース ローカル グループに適用されます。 アカウント グループとワークスペース ローカル グループの違いを参照してください。

  • カタログまたはスキーマ内のオブジェクトに対するすべての操作には、カタログおよびスキーマに対するUSE CATALOG および USE SCHEMA 権限が必要です。 テーブルに対するプリンシパルの権限に関係なく、プリンシパルには、スキーマにアクセスするための親カタログに対する USE CATALOG 権限と、スキーマ内のオブジェクトにアクセスするための USE SCHEMA 権限も必要です。一方、ワークスペース レベルのテーブルアクセスコントロールでは、ルート カタログに USAGE を付与すると、すべてのデータベースに対する USAGE が自動的に付与されますが、ルート カタログに対する USAGE は必要ありません。

  • ビュー: Unity Catalogでは、ビューの所有者は、ビューの参照テーブルおよびビューの所有者である必要はありません。 SELECT 特権があれば十分で、ビューの親スキーマと親カタログの USE CATALOG に対する USE SCHEMA も十分です。ワークスペース レベルのテーブルアクセスコントロールでは、ビューの所有者は、参照されるすべてのテーブルとビューの所有者である必要があります。

  • ANY FILE または ANONYMOUS FUNCTION はサポートされていません: Unity Catalogには、権限のないユーザーが権限のあるコードを実行できる可能性があるセキュリティ保護可能な ANY FILE または ANONYMOUS FUNCTION の概念はありません。

  • READ_METADATA権限がありません: Unity Catalog は、メタデータを表示するためのアクセスを別の方法で管理します。 Unity Catalog権限とセキュリティ保護可能なオブジェクト」を参照してください。

Unity Catalog オブジェクトと Hive metastore オブジェクト間の結合

3 レベルの名前空間表記を使用すると、 Unity Catalog メタストア内のデータをレガシ Hive metastore内のデータと結合できます。

従来の Hive metastore のデータとの結合は、そのデータが存在するワークスペースでのみ機能します。 このような結合を別のワークスペースで実行しようとすると、エラーが発生します。 Databricks では、従来のテーブルとビューを Unity Catalog に アップグレード することをお勧めします。

次の例では、 order_id フィールドが等しい場合に、レガシ Hive metastore の sales_current テーブルと Unity Catalog メタストアの sales_historical テーブルを結合します。

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;
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
))
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 metastore から Unity Catalog に移行する場合は、通常、 Hive metastoreを参照する既存のコードに影響を与えないように、既定のカタログとして hive_metastore を使用するのが理にかなっています。

デフォルト カタログを取得して切り替える方法については、「デフォルト カタログの管理」を参照してください

クラスター スコープのデータ アクセス許可

Hive metastore を Unity Catalogと一緒に使用すると、クラスターに関連付けられたデータ アクセス資格情報は、 Hive metastore データへのアクセスに使用されますが、 Unity Catalogに登録されているデータには使用されません。

ユーザーが Unity Catalog の外部にあるパス (テーブルまたは外部ロケーションとして登録されていないパスなど) にアクセスする場合は、クラスターに割り当てられたアクセス資格情報が使用されます。

Google Cloud Storage への接続」を参照してください。

レガシーテーブルを Unity Catalog にアップグレードする

Hive metastore 内のテーブルは、組み込みの監査やアクセス制御など、Unity Catalog に導入されたセキュリティおよびガバナンス機能の完全なセットの恩恵を受けません。Databricks では、 レガシ テーブル を Unity Catalogに追加してアップグレードすることをお勧めします。