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

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

ワークスペースが Unity Catalogに対して有効になる前にサービスにあった場合は、引き続き使用するデータを含む組み込み Hive metastore がある可能性があります。 ではDatabricks Hive metastoreフェデレーション Unity CatalogHive metastoreを使用して、 をミラーリングするフェデレーションカタログを に作成し、最終的にはそのフェデレーションカタログを使用するようにすべてのレガシーワークロードを移行することをお勧めします。ただし、 Hive metastore フェデレーションプロセスをまだ開始していない場合は、この記事を使用して、レガシ 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 におけるアクセス制御

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

Unity Catalog従来のテーブルアクセスコントロール と比較した 特権モデル

のアクセス制御モデルは、従来の のUnity Catalog テーブルアクセスコントロールHive metastore とは次の点で異なります。

  • アカウント グループ: 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。

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

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

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

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

Amazon S3 への接続」を参照してください。

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

Hive metastore内のテーブルは、組み込み監査、リネージ、アクセス制御など、Unity Catalog が導入するセキュリティおよびガバナンス機能の完全なセットの恩恵を受けません。Databricks では、Hive metastore フェデレーションを使用して、Hive metastore に登録されているデータを Unity Catalogに移行するか、レガシーテーブルを Unity Catalogに追加して直接アップグレードすることをお勧めします。