Databricks 間 Delta Sharing を使用して共有されたデータを読み取る (受信者の場合)

この記事では、Databricks がデータ共有用のセキュリティで保護された接続を管理する "Databricks 間" Delta Sharing プロトコルを使用して、共有されたデータを読み取る方法について説明します。 Delta Sharing "オープン共有" プロトコルとは異なり、Databricks 間プロトコルには資格情報ファイルは必要ありません (トークンベースのセキュリティ)。

Databricks 間の共有では、Unity Catalog が有効になっている Databricks ワークスペースに受信者がアクセスできる必要があります。

Unity Catalog が有効になっている Databricks ワークスペースがない場合、Delta Sharing オープン共有プロトコルを使用してデータを共有する必要があります。また、この記事は参考になりません。 「Delta Sharing オープン共有を使用した共有データを読み取る (受信者の場合)」を参照してください。

チームが共有データを利用できるようにする方法

Databricks 間プロトコルを使用して共有されているデータとノートブックを読み取るには、Unity Catalog が有効になっている Databricks ワークスペースのユーザーである必要があります。 チームのメンバーは、Unity カタログ メタストアの一意の識別子をデータ プロバイダーに提供し、データ プロバイダーはその識別子を使用して組織との安全な共有接続を作成します。 その後、共有データはワークスペースで読み取りアクセスが可能になります。また、データ プロバイダーが共有テーブル、ビュー、ボリューム、パーティションに対して行うすべての更新は、凖リアルタイムでワークスペースに反映されます。

Note

共有のデータ テーブル、ビュー、ボリュームに対する更新は、凖リアルタイムでワークスペースに表示されます。 ただし、列の変更 (追加、名前変更、削除) は最大 1 分間、カタログ エクスプローラーに表示されない場合があります。 同様に、共有に対する新しい共有と更新 (共有への新しいテーブルの追加など) は、表示およびクエリを実行できるようになる前に 1 分間キャッシュされます。

共有されているデータを読み取る方法:

  1. チームのユーザーが "共有" (自分と共有されているテーブル、ビュー、ボリューム、ノートブックのコンテナー) を見つけ、その共有を使用して "カタログ" (Databricks Unity Catalog 内のすべてのデータの最上位コンテナー) を作成します。
  2. チームのユーザーは、カタログとカタログ内のオブジェクト (スキーマ、テーブル、ビュー、ボリューム) へのアクセスを、チームの他のメンバーに許可または拒否します。
  3. 自分にアクセス権が付与されているテーブル、ビュー、ボリューム内のデータを、読み取り専用 (SELECT または READ VOLUME) アクセス権を持つ Databricks の他のデータ資産と同様に読み取ります。
  4. カタログに対する USE CATALOG 特権がある限り、共有内のノートブックをプレビューおよび複製できます。

必要なアクセス許可

すべてのプロバイダーとプロバイダー共有に関する詳細を一覧表示および表示できるようにするには、メタストア管理者であるか、USE PROVIDER 特権を持っている必要があります。 他のユーザーは、自分が所有するプロバイダーと共有にのみアクセスできます。

プロバイダー共有からカタログを作成するには、メタストア管理者、Unity Catalog メタストアの CREATE_CATALOG 特権と USE PROVIDER 特権の両方を持つユーザー、または、プロバイダー オブジェクトの CREATE_CATALOG 特権と所有権の両方を持つユーザーである必要があります。

共有から作成されたカタログ内のスキーマ (データベース)、テーブル、ビュー、ボリュームへの読み取り専用アクセスの付与は、一般的な Unity Catalog 特権階層に従って行うことができます。 共有から作成されたカタログ内のノートブックを表示するには、カタログに対する USE CATALOG 特権が必要です。 「Delta Sharing カタログ内のスキーマ、テーブル、ボリュームのアクセス許可を管理する」を参照してください。

プロバイダーと共有を表示する

データ プロバイダーによって共有されたデータの読み取りを開始するには、プロバイダーがデータを共有したら、"プロバイダー" の名前を把握し、Unity Catalog メタストアに格納されているオブジェクトを "共有する" 必要があります。

プロバイダー オブジェクトは、データの共有元の組織の Unity Catalog メタストア、クラウド プラットフォーム、リージョンを表します。

共有オブジェクトは、プロバイダーが自分と共有したテーブル、ボリューム、ビューを表します。

データの共有元のすべてのプロバイダーを表示する

使用可能なデータ プロバイダーの一覧を表示するには、カタログ エクスプローラー、Databricks Unity Catalog CLI、または Azure Databricks ノートブックや Databricks SQL クエリ エディターで SHOW PROVIDERS SQL コマンドを使用することができます。

必要なアクセス許可: メタストア管理者であるか、USE PROVIDER 特権を持っている必要があります。 他のユーザーは、自分が所有するプロバイダーとプロバイダー共有にのみアクセスできます。

詳細については、「プロバイダーを表示する」を参照してください。

プロバイダーの詳細を表示する

プロバイダーの詳細を表示するには、カタログ エクスプローラー、Databricks Unity Catalog CLI、または Azure Databricks ノートブックや Databricks SQL クエリ エディターで DESCRIBE PROVIDER SQL コマンドを使用することができます。

必要なアクセス許可: メタストア管理者であるか、USE PROVIDER 特権を持っているか、プロバイダー オブジェクトを所有している必要があります。

詳細については、「プロバイダーの詳細を表示する」を参照してください。

共有を表示する

プロバイダーが共有している共有を表示するには、カタログ エクスプローラー、Databricks Unity Catalog CLI、または Azure Databricks ノートブックや Databricks SQL クエリ エディターで SHOW SHARES IN PROVIDER SQL コマンドを使用することができます。

必要なアクセス許可: メタストア管理者であるか、USE PROVIDER 特権を持っているか、プロバイダー オブジェクトを所有している必要があります。

詳細については、「プロバイダーが共有した共有を表示する」を参照してください。

共有テーブルまたはボリューム内のデータにアクセスする

共有テーブルまたはボリューム内のデータを読み取るには、次のようにします。

  1. 特権ユーザーは、テーブルまたはボリュームを含む共有からカタログを作成する必要があります。 これは、メタストア管理者、Unity Catalog メタストアの CREATE_CATALOG 特権と USE PROVIDER 特権の両方を持つユーザー、または、プロバイダー オブジェクトの CREATE_CATALOG 特権と所有権の両方を持つユーザーです。
  2. そのユーザーまたは同じ特権を持つユーザーから、共有テーブルまたはボリュームへのアクセス権が付与される必要があります。
  3. テーブルまたはボリュームには、Unity Catalog メタストアに登録されている他のデータ資産と同じようにアクセスできます。

共有からカタログを作成する

共有内のデータにチームがアクセスできるようにするには、共有からカタログを作成する必要があります。 共有からカタログを作成するには、カタログ エクスプローラー、Databricks Unity Catalog CLI、または Azure Databricks ノートブックまたは Databricks SQL クエリ エディターで SQL コマンドを使用します。

必要なアクセス許可: これは、メタストア管理者、Unity Catalog メタストアの CREATE_CATALOG 特権と USE PROVIDER 特権の両方を持つユーザー、または、プロバイダー オブジェクトの CREATE_CATALOG 特権と所有権の両方を持つユーザーです。

Note

共有にビューが含まれている場合は、プロバイダーのメタストア内のビューを含むカタログの名前とは異なるカタログ名を使用する必要があります。

カタログ エクスプローラー

  1. Azure Databricks ワークスペースで、カタログ アイコンカタログ をクリックします。
  2. 左側のペインで、[Delta Sharing] メニューを展開し、[自分と共有] を選択します。
  3. [プロバイダー] タブで、プロバイダーを選びます。
  4. [共有] タブで共有を見つけ、共有行の [カタログの作成] をクリックします。
  5. カタログの名前とコメント (省略可能) を入力します。
  6. Create をクリックしてください。

Sql

ノートブックまたは Databricks SQL クエリ エディターで次のコマンドを実行します。

CREATE CATALOG [IF NOT EXISTS] <catalog-name>
USING SHARE <provider-name>.<share-name>;

Cli

databricks unity-catalog catalogs create --name <catalog-name> /
                                    --provider <provider-name> /
                                    --share <share-name>

共有から作成されたカタログには、Delta Sharing のカタログの種類があります。 種類は、カタログ エクスプローラーのカタログ詳細ページで表示することも、ノートブックまたは Databricks SQL クエリで DESCRIBE CATALOG SQL コマンドを実行して表示することもできます。 すべての共有カタログは、カタログ エクスプローラーで左側のペインの [カタログ]> [共有] に表示されます。

Delta Sharing カタログは、Unity Catalog メタストア上の通常のカタログと同じ方法で管理できます。 Delta Sharing カタログを表示、更新、削除するには、カタログ エクスプローラー、Databricks CLI、SQL コマンド SHOW CATALOGSDESCRIBE CATALOGALTER CATALOGDROP CATALOG を使用できます。

共有から作成された Delta Sharing カタログ下の 3 レベルの名前空間構造は、Unity Catalog 上の通常のカタログ下の構造 (catalog.schema.table または catalog.schema.volume) と同じです。

共有カタログの下のテーブルおよびボリューム データは読み取り専用です。つまり、次のような読み取り操作を実行できます。

  • テーブルに対する DESCRIBESHOWSELECT
  • ボリュームに対する DESCRIBE VOLUMELIST <volume-path>SELECT * FROM <format>.'<volume_path>'COPY INTO

共有カタログ内のノートブックは、カタログに対する USE CATALOG を持つ任意のユーザーがプレビューおよび複製できます。

Delta Sharing カタログ内のスキーマ、テーブル、ボリュームのアクセス許可を管理する

既定では、カタログ作成者は Delta Sharing カタログのすべてのデータ オブジェクトの所有者であり、それらのアクセス許可を管理できます。

特権は下位に継承されますが、一部のワークスペースは継承を提供しなかったレガシ セキュリティ モデルにまだ残っている可能性があります。 「継承モデル」を参照してください。 カタログに対する SELECT 特権を付与されたユーザーは、その特権が取り消されない限り、カタログ内のすべてのスキーマとテーブルに対する SELECT 特権を持ちます。 同様に、カタログに対する READ VOLUME 特権を付与されたユーザーは、その特権が取り消されない限り、カタログ内のすべてのボリュームに対する READ VOLUME 特権を持ちます。 Delta Sharing カタログまたは Delta Sharing カタログ内のオブジェクトへの書き込みまたは更新アクセス権を付与する特権を付与することはできません。

カタログ所有者は、データ オブジェクトの所有権を他のユーザーまたはグループに委任できるため、それらのユーザーにオブジェクトのアクセス許可とライフ サイクルを管理する権限を付与できます。

Unity Catalog を使用してデータ オブジェクトに対する特権を管理する方法の詳細については、「Unity Catalog の特権の管理」を参照してください。

共有テーブル内のデータを読み取る

Azure Databricks ユーザーとして使用できる任意のツール (カタログ エクスプローラー、ノートブック、SQL クエリ、Databricks CLI、Databricks REST API) を使用して、共有テーブル内のデータを読み取ることができます。 テーブルに対する SELECT 特権が必要です。

共有ボリューム内のデータを読み取る

Azure Databricks ユーザーとして使用できる任意のツール (カタログ エクスプローラー、ノートブック、SQL クエリ、Databricks CLI、Databricks REST API) を使用して、共有ボリューム内のデータを読み取ることができます。 ボリュームに対する READ VOLUME 特権が必要です。

テーブルの履歴データに対してクエリを実行する

履歴がテーブルと共に共有されている場合は、バージョンまたはタイムスタンプを指定してテーブル データに対してクエリを実行できます。 Databricks Runtime 12.2 LTS 以降が必要です。

次に例を示します。

SELECT * FROM vaccine.vaccine_us.vaccine_us_distribution VERSION AS OF 3;
SELECT * FROM vaccine.vaccine_us.vaccine_us_distribution TIMESTAMP AS OF "2023-01-01 00:00:00";

さらに、テーブルで変更データ フィード (CDF) が有効になっている場合は、CDF に対してクエリを実行できます。 バージョンとタイムスタンプの両方がサポートされています。

SELECT * FROM table_changes('vaccine.vaccine_us.vaccine_us_distribution', 0, 3);
SELECT * FROM table_changes('vaccine.vaccine_us.vaccine_us_distribution', "2023-01-01 00:00:00", "2022-02-01 00:00:00");

変更データ フィードの詳細については、「Azure Databricks で Delta Lake 変更データ フィードを使用する」を参照してください。

Apache Spark Structured Streaming を使用してテーブルに対してクエリを実行する

テーブルが履歴と共有されている場合は、それを Spark Structured Streaming のソースとして使用できます。 Databricks Runtime 12.2 LTS 以降が必要です。

サポートされているオプション:

  • ignoreDeletes: データを削除するトランザクションを無視します。
  • ignoreChanges: UPDATEMERGE INTODELETE (パーティション内)、OVERWRITE などのデータ変更操作のためにファイルがソース テーブルで書き換えられた場合は、更新を再処理します。 変更されていない行は、引き続き出力できます。 そのため、ダウンストリームのコンシューマーが重複を処理できる必要があります。 削除はダウンストリームには反映されません。 ignoreChangesignoreDeletes を含みます。 そのため、ignoreChanges を使用する場合、ソース テーブルに対する削除または更新によってストリームが中断されることはありません。
  • startingVersion: 対象となる最初の共有テーブルのバージョン。 このバージョン (を含む) 以降のすべてのテーブル変更は、ストリーミング ソースによって読み取りされます。
  • startingTimestamp: 対象となる最初のタイムスタンプ。 このタイムスタンプ (を含む) 以降にコミットされたすべてのテーブル変更は、ストリーミング ソースによって読み取りされます。 例: "2023-01-01 00:00:00.0"
  • maxFilesPerTrigger: すべてのマイクロバッチで考慮される新しいファイルの数。
  • maxBytesPerTrigger: 各マイクロバッチで処理されるデータの量。 このオプションにより "ソフト最大値" が設定されます。これは、最小の入力単位がこの制限を超える場合にストリーミング クエリを進めるために、バッチでほぼこの量のデータが処理され、制限を超える処理が行われる可能性があることを意味します。
  • readChangeFeed: 共有テーブルの変更データ フィードをストリームで読み取ります。

サポートされていないオプション:

  • Trigger.availableNow

サンプルの構造化ストリーミング クエリ

Scala
spark.readStream.format("deltaSharing")
.option("startingVersion", 0)
.option("ignoreChanges", true)
.option("maxFilesPerTrigger", 10)
.table("vaccine.vaccine_us.vaccine_us_distribution")
Python
spark.readStream.format("deltaSharing")\
.option("startingVersion", 0)\
.option("ignoreDeletes", true)\
.option("maxBytesPerTrigger", 10000)\
.table("vaccine.vaccine_us.vaccine_us_distribution")

テーブルで変更データ フィード (CDF) が有効になっている場合は、CDF をストリームで読み取りできます。

spark.readStream.format("deltaSharing")
.option("readChangeFeed", "true")
.table("vaccine.vaccine_us.vaccine_us_distribution")

削除ベクターまたは列マッピングが有効になっているテーブルの読み取り

重要

この機能はパブリック プレビュー段階にあります。

削除ベクトルは、プロバイダーが共有 Delta テーブルで有効にできるストレージ最適化機能です。 「削除ベクトルとは」を参照してください。

Azure Databricks では、Delta テーブルの列マッピングもサポートされています。 「Delta Lake の列マッピングを使用して列の名前変更と削除を行う」をご覧ください。

削除ベクトルまたは列マッピングが有効になっているテーブルをプロバイダーが共有している場合は、SQL ウェアハウスまたは Databricks Runtime 14.1 以降を実行しているクラスターを使用して、テーブルに対してバッチ読み取りを実行できます。 CDF とストリーミングの各クエリには、Databricks Runtime 14.2 以降が必要です。

バッチ クエリは、共有テーブルのテーブル機能に基づいて responseFormat を自動的に解決できるため、そのまま実行できます。

変更データ フィード (CDF) を読み取ったり、削除ベクトルまたは列マッピングが有効になっている共有テーブルに対してストリーミング クエリを実行したりするには、追加のオプション responseFormat=delta を設定する必要があります。

次の例は、バッチ、CDF、ストリーミングの各クエリを示しています。

import org.apache.spark.sql.SparkSession

// Batch query
spark.read.format("deltaSharing").table(<tableName>)

// CDF query
spark.read.format("deltaSharing")
  .option("readChangeFeed", "true")
  .option("responseFormat", "delta")
  .option("startingVersion", 1)
  .table(<tableName>)

// Streaming query
spark.readStream.format("deltaSharing").option("responseFormat", "delta").table(<tableName>)

共有ビューを読み取る

重要

この機能はパブリック プレビュー段階にあります。

Note

ビュー共有は、Databricks 間の共有でのみサポートされます。

以下の例外を除き、共有ビューの読み取りは共有テーブルの読み取りと同じです。

コンピューティングの要件:

  • Azure Databricks アカウントがプロバイダーのものと異なる場合は、サーバーレス SQL ウェアハウスを使用して共有ビューのクエリを実行する必要があります。
  • プロバイダーが同じ Azure Databricks アカウントにある場合は、任意の SQL ウェアハウスを使用できます。また、共有アクセス モードを使用したクラスターを使用することもできます。

ビューのビューに関する制限:

共有ビューを参照するビューを作成することはできません。

共有の制限を表示する:

共有テーブルまたは共有ビューを参照するビューを共有することはできません。

名前付けに関する要件:

ビューを含む共有カタログに使用するカタログ名は、そのビューで参照されるテーブルを含むプロバイダー カタログと同じであってはなりません。 たとえば、共有ビューが test カタログに含まれており、そのビューで参照されるプロバイダーのテーブルのいずれかがプロバイダーの test カタログに含まれる場合、クエリを実行すると名前空間の競合エラーが発生します。 「共有からカタログを作成する」を参照してください。

履歴とストリーミング:

履歴のクエリを実行したり、ストリーミング ソースとしてビューを使用したりすることはできません。

JDBC/ODBC:

この記事の手順では、Azure Databricks のユーザー インターフェイス、特に Unity Catalog の構文とインターフェイスを使用して共有データを読み取る方法について説明しています。 Databricks JDBC/ODBC ドライバーを使用することで、Apache Spark、Python、BI ツール (Tableau や Power BI など) を使用して共有ビューのクエリを実行することもできます。 Databricks の JDBC ドライバーと ODBC ドライバーを使って接続する方法については、「Databricks ODBC および JDBC ドライバー」をご覧ください。

共有ノートブックの読み取り

共有ノートブック ファイルをプレビューおよび複製するには、カタログ エクスプローラーを使用できます。

必要なアクセス許可: 共有から作成されたカタログに対する USE CATALOG 特権を持つカタログ所有者またはユーザー。

  1. Azure Databricks ワークスペースで、カタログ アイコンカタログ をクリックします。

  2. 左側のウィンドウで、[カタログ] メニューを展開し、共有から作成されたカタログを見つけて選択します。

  3. [その他の資産] タブには、共有ノートブック ファイルが表示されます。

  4. 共有ノートブック ファイルの名前をクリックしてプレビューします。

  5. (省略可能) [複製] ボタンをクリックして、共有ノートブック ファイルをワークスペースにインポートします。

    1. [複製先] ダイアログで、必要に応じて [新しい名前] を入力し、ノートブック ファイルの複製先のワークスペース フォルダーを選択します。
    2. [複製] をクリックします。
    3. ノートブックが複製されると、ダイアログが表示され、正常に複製されたことを通知します。 ダイアログで [ノートブック エディターで表示] をクリックして、ノートブック エディターで表示します。

    Databricks ノートブックの概要」を参照してください。