レガシー Hive metastore と並行して作業 Unity Catalog
この記事では、Databricksワークスペースが Unity Catalogに対して有効になっている場合に、従来のワークスペースごとの Hiveメタストアを引き続き使用するための 1つの方法について説明します。
ワークスペースが Unity Catalogで有効になる前にサービスに含まれていた場合は、引き続き使用するデータを含む Hive metastore が含まれている可能性があります。 この記事では、 Hive metastoreに登録されているテーブルを引き続き操作する方法について説明します。
ワークスペースごとの Hive metastore は従来の機能であり、この記事で説明する手順は従来のワークフローを表しています。
Hive metastore内のテーブルは、組み込み監査、リネージ、アクセス制御など、Unity Catalogによって提供されるセキュリティ機能とガバナンス機能の完全なセットの恩恵を受けません。Databricks では、これらのテーブルとそれらを参照するワークロードを Unity Catalog に移行し、 Hive metastoreへの直接アクセスを無効にすることをお勧めします。
次の 2 つの移行パスを使用できます。
- 
Hive metastoreに登録されているすべてのテーブルを Unity Catalogにアップグレードします。
 - 
Hiveメタストアフェデレーション を使用してHiveメタストアをUnity Catalog にフェデレーションし、より段階的なアプローチを実現します。Hive metastoreフェデレーションは、Hiveメタストア をミラーリングするフォーリンカタログをUnity Catalogに作成します。
 
Hive metastoreでレガシ をクエリするUnity Catalog
Unity Catalogメタストアは付加的であるため、Databricks のワークスペースごとのHiveメタストアと共に使用できます。Hive metastoreは、3 レベルの名前空間に hive_metastore という最上位のカタログとして表示されます。
たとえば、レガシ Hive metastore のsalesスキーマで sales_raw というテーブルを参照するには、次の表記を使用します。
- SQL
 - Python
 - R
 - Scala
 
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 ステートメントでカタログとスキーマを指定することもできます。
- SQL
 - Python
 - R
 - Scala
 
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"))
レガシーなHiveメタストアと比較したUnity Catalogのアクセス制御
Hiveメタストアで レガシー テーブルアクセスコントロールを設定した場合、 Databricksは、標準アクセスモードで実行されているクラスターにおいては、hive_metastore カタログ内のデータに対して、これらのアクセス制御を引き続き適用します。
Unity Catalog のアクセス モデルは、従来のアクセス制御とは少し異なります。
- メタストア : Unity Catalog はアカウント レベルのオブジェクトであり、 Hive metastore はワークスペース レベルのオブジェクトです。 
hive_metastoreカタログ内で定義された権限は、常にワークスペース内のローカルユーザーとグループを参照します。 - アカウント グループ : Access control ポリシー in Unity Catalog はアカウント グループに適用され、 Hive metastore のアクセス制御ポリシー はワークスペース-local グループに適用されます。 「グループソース」を参照してください。
 - カタログまたはスキーマ内のオブジェクトに対するすべての操作には、カタログとスキーマに対する
USE CATALOGおよびUSE SCHEMAのパーミッションが必要です 。テーブルに対するプリンシパルの権限に関係なく、プリンシパルは、スキーマにアクセスするための親カタログに対するUSE CATALOG権限と、スキーマ内のオブジェクトにアクセスするためのUSE SCHEMA権限も必要です。一方、ワークスペース レベルのテーブルアクセスコントロールでは、ルート カタログでUSAGEを付与すると、すべてのデータベースに対するUSAGEが自動的に付与されますが、ルート カタログでのUSAGEは必要ありません。 - ビュー : Unity Catalog では、ビューの所有者は、ビューの参照されるテーブルとビューの所有者である必要はありません。
SELECT権限があれば、ビューの親スキーマのUSE SCHEMAと親カタログのUSE CATALOGとともに十分です。ワークスペースレベルのテーブルアクセスコントロールでは、ビューの所有者は、参照されるすべてのテーブルとビューの所有者である必要があります。 ANY FILEまたはANONYMOUS FUNCTIONのサポートなし : Unity Catalog には、特権のないユーザーが特権コードを実行できるようにするANY FILEまたはANONYMOUS FUNCTIONのセキュリティ保護可能なオブジェクトの概念はありません。DENYはサポートされていません : Unity Catalog 特権モデルは、最小特権の原則に基づいて構築されています。付与されていない特権は、暗黙的に拒否されます。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 テーブルを結合します。
- SQL
 - Python
 - R
 - Scala
 
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 メタストア から Unity Catalog に移行する場合は、完全に移行を完了していない場合は、 Hive メタストア を参照する既存のコードに影響を与えないように、hive_metastore をデフォルト カタログとして使用するのが合理的です。
デフォルト カタログを取得して切り替える方法については、「 デフォルト カタログの管理」を参照してください
クラスター スコープのデータ アクセス権限
Hive metastore を Unity Catalogと共に使用すると、クラスターに関連付けられたデータ アクセス資格情報は、Hive metastoreデータへのアクセスに使用されますが、Unity Catalogに登録されているデータへのアクセスには使用されません。
ユーザーが Unity Catalog の外部にあるパス (テーブルまたは外部ロケーションとして登録されていないパスなど) にアクセスする場合は、クラスターに割り当てられたアクセス資格情報が使用されます。
Google Cloud Storage への接続をご覧ください。