Unity Catalog を Delta Live Tables パイプラインで使う
重要
Unity Catalog の Delta Live Tables サポートはパブリック プレビュー段階です。
Hive メタストアへのテーブル保持のサポートに加えて、Delta Live Tables パイプラインで Unity Catalog を使用して次のことができます。
- パイプラインがテーブルを保持するカタログを Unity Catalog で定義します。
- Unity Catalog テーブルからデータを読み取る。
ワークスペースには、Unity Catalog または Hive メタストアを使用するパイプラインを含めることができます。 ただし、1 つのパイプラインで Hive メタストアと Unity Catalog の両方に書き込むことはできません。また、Unity Catalog を使用するように既存のパイプラインをアップグレードすることはできません。 Unity Catalog を使用しない既存のパイプラインは、このプレビューの影響を受けず、構成された保存場所を使用して Hive メタストアにデータを保持し続けます。
このドキュメントで特に指定がない限り、既存のすべてのデータ ソースと Delta Live Tables 機能は、Unity Catalog を使用するパイプラインでサポートされます。 Python と SQL の両方のインターフェイスは、Unity Catalog を使用するパイプラインでサポートされています。
パイプラインで作成されたテーブルは、Databricks Runtime 13.3 LTS 以降または SQL ウェアハウスを使用して、共有 Unity Catalog クラスターからクエリを実行することもできます。 割り当てられたクラスターおよび分離なしクラスターからはテーブルに対するクエリは実行できません。
Unity Catalog パイプラインによって作成されたテーブルに対するアクセス許可を管理するには、GRANT と REVOKE を使用します。
必要条件
Delta Live Tables パイプラインから Unity Catalog にテーブルを作成するには、次の要件が必要です。
- ターゲット カタログに対する
USE CATALOG
権限が必要です。 - パイプラインで具体化されたビューを作成する場合は、ターゲット スキーマに
CREATE MATERIALIZED VIEW
とUSE SCHEMA
の権限が必要です。 - パイプラインでストリーミング テーブルを作成する場合は、ターゲット スキーマに
CREATE TABLE
とUSE SCHEMA
の権限が必要です。 - パイプライン設定でターゲット スキーマが指定されていない場合は、ターゲット カタログ内の少なくとも 1 つのスキーマに対する
CREATE MATERIALIZED VIEW
権限またはCREATE TABLE
権限が必要です。
制限事項
Delta Live Tables で Unity Catalog を使用する場合の制限事項を次に示します。
既定では、Unity Catalog 対応パイプラインを実行するクラスターからのドライバー ログを表示するアクセス許可を持つのは、パイプライン所有者とワークスペース管理者だけです。 他のユーザーがアクセスしてドライバー ログを表示できるようにするには、「管理者以外のユーザーが Unity Catalog 対応パイプラインからドライバー ログを表示できるようにする」をご覧ください。
Hive メタストアを使用する既存のパイプラインは、Unity Catalog を使用するようにアップグレードすることはできません。 Hive メタストアに書き込む既存のパイプラインを移行するには、新しいパイプラインを作成し、データ ソースからデータを再取り込みする必要があります。
Unity Catalog パブリック プレビュー中に作成されたメタストアにアタッチされたワークスペースに、Unity Catalog 対応パイプラインを作成することはできません。 「特権継承へのアップグレード」を参照してください。
JAR はサポートされていません。 サード パーティ製ライブラリのインストールは、Python ライブラリでのみサポートされています。 「Delta Live Tables パイプラインの Python 依存関係を管理する」を参照してください。
ストリーミング テーブルのスキーマを変更するデータ操作言語 (DML) クエリはサポートされていません。
Delta Live Tables パイプラインで作成された具体化されたビューは、そのパイプラインの外部 (別のパイプラインやダウンストリーム ノートブックなど) におけるストリーミング ソースとして使用することはできません。
マネージド ストレージの場所を指定するスキーマへの発行は、プレビュー チャネルでのみサポートされます。
パイプラインが保存場所が管理されているスキーマに発行を行う場合、以降の更新でスキーマを変更できます。ただし、更新されたスキーマが以前に指定されていたスキーマと同じ保存場所を使用する場合に限ります。
ターゲット スキーマで保存場所が指定されている場合は、すべてのテーブルがそこに保存されます。 スキーマの保存場所が指定されていない場合、テーブルはカタログの保存場所に保存されます (ターゲット カタログでそれが指定されている場合)。 スキーマとカタログの保存場所が指定されていない場合、テーブルは、テーブルが発行されるメタストアのルートの保存場所に保存されます。
カタログ エクスプローラーの [履歴] タブには、ストリーミング テーブルと具体化されたビューの履歴は表示されません。
テーブルを定義する場合、
LOCATION
プロパティはサポートされません。Unity Catalog 対応パイプラインは、Hive メタストアに発行できません。
Python UDF のサポートはパブリック プレビュー段階です。 Python UDF を使用するには、パイプラインでプレビュー チャネルを使用する必要があります。
Delta Live Tables の具体化されたビューや、Unity Catalog に発行されたストリーミング テーブルで Delta Sharing を使用することはできません。
パイプラインまたはクエリで
event_log
テーブル値関数を使用して複数のパイプラインのイベント ログにアクセスすることはできません。event_log
テーブル値関数に対して作成されたビューを他のユーザーと共有することはできません。単一ノード クラスターは、Unity Catalog 対応パイプラインではサポートされていません。 Delta Live Tables では、小さいパイプラインを実行するために単一ノード クラスターが作成される可能性があるので、
single-node mode
を参照するエラー メッセージと共にパイプラインが失敗する可能性があります。 これが発生する場合は、 コンピューティング設定を構成するときに、少なくとも 1 つの worker を指定してください。Unity Catalog 対応パイプラインで作成されたテーブルに対しては、割り当てられたクラスターおよび分離なしクラスターからクエリを実行できません。 Delta Live Tables パイプラインによって作成されたテーブルのクエリを実行するには、Databricks Runtime 13.3 LTS 以降または SQL ウェアハウスを使って、共有アクセス モード クラスターを使う必要があります。
Delta Live Tables では、共有アクセス モード クラスターを使って Unity Catalog 対応パイプラインが実行されます。 割り当てられたクラスターで Unity Catalog 対応パイプラインを実行することはできません。 Unity Catalog での共有アクセス モードの制限については、「Unity Catalog での共有アクセス モードの制限事項」をご覧ください。
行フィルターまたは列マスクを具体化されたビューや Unity Catalog に発行されたストリーミング テーブルで使用することはできません。
Note
具体化されたビューをサポートする基になるファイルには、具体化されたビュー定義に表示されないアップストリーム テーブルのデータ (個人を特定できる情報を含む) が含まれる場合があります。 このデータは、具体化されたビューの増分更新をサポートするために、基になるストレージに自動的に追加されます。
具体化されたビューの基になるファイルは、具体化されたビュー スキーマの一部ではないアップストリーム テーブルからデータを公開する可能性があるため、Databricks では、基になるストレージを信頼関係のないダウンストリーム コンシューマーと共有しないことをお勧めします。
たとえば、具体化されたビューの定義に COUNT(DISTINCT field_a)
句が含まれているとします。 具体化されたビュー定義には集計 COUNT DISTINCT
句のみが含まれていますが、基になるファイルには field_a
の実際の値の一覧が含まれています。
既存の機能に対する変更
Delta Live Tables が Unity Catalog にデータを保持するように構成されている場合、テーブルのライフサイクルは Delta Live Tables パイプラインによって管理されます。 パイプラインはテーブルのライフサイクルとアクセス許可を管理するため、
- Delta Live Tables パイプライン定義からテーブルが削除されると、次のパイプライン更新時に、対応する具体化されたビューまたはストリーミング テーブルエントリが Unity Catalog から削除されます。 実際のデータは、誤って削除された場合に復旧できるように、一定期間保持されます。 データを回復するには、具体化されたビューまたはストリーミング テーブルをパイプライン定義に追加し直します。
- Delta Live Tables パイプラインを削除すると、そのパイプラインで定義されているすべてのテーブルが削除されます。 この変更により、パイプライン削除の際に確認を求めるように Delta Live Tables UI が更新されました。
APPLY CHANGES INTO
をサポートするために使用されるバッキング テーブルを含む内部バッキング テーブルには、ユーザーが直接アクセスすることはできません。
Delta Live Tables パイプラインから Unity Catalog にテーブルを書き込む
Note
パイプラインに対してカタログとターゲット スキーマを選択しない場合、テーブルは、Unity Catalog に発行されず、同じパイプライン内のクエリによってのみアクセス可能となります。
テーブルを Unity Catalog に書き込むには、パイプラインを作成するときに、[ストレージのオプション] で [Unity Catalog] を選択し、[カタログ] ドロップダウン メニューでカタログを選択してから、既存のスキーマを選択するか、[ターゲット スキーマ] ドロップダウン メニューで新しいスキーマの名前を入力します。 Unity Catalog カタログの詳細については、「Azure Databricks のカタログとは」を参照してください。 Unity Catalog のスキーマについては、「Azure Databricks のスキーマとは」を参照してください。
Unity Catalog パイプラインにデータを取り込む
Unity Catalog を使用するように構成されたパイプラインは、次の場所からデータを読み取ることができます。
- Unity Catalog のマネージド テーブルと外部テーブル、ビュー、具体化されたビュー、ストリーミング テーブル。
- Hive メタストアのテーブルとビュー。
cloud_files()
関数を使用して Unity Catalog の外部の場所から読み取る自動ローダー。- Apache Kafka と Amazon Kinesis。
Unity Catalog テーブルと Hive メタストア テーブルからの読み取りの例を次に示します。
Unity Catalog テーブルからのバッチ インジェスト
SQL
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
my_catalog.my_schema.table1;
Python
@dlt.table
def table_name():
return spark.table("my_catalog.my_schema.table")
Unity Catalog テーブルから変更をストリーム配信する
SQL
CREATE OR REFRESH STREAMING TABLE
table_name
AS SELECT
*
FROM
STREAM(my_catalog.my_schema.table1);
Python
@dlt.table
def table_name():
return spark.readStream.table("my_catalog.my_schema.table")
Hive メタストアからデータを取り込む
Unity Catalog を使用するパイプラインでは、hive_metastore
カタログを使用して Hive メタストア テーブルからデータを読み取ることができます。
SQL
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
hive_metastore.some_schema.table;
Python
@dlt.table
def table3():
return spark.table("hive_metastore.some_schema.table")
自動ローダーからデータを取り込む
SQL
CREATE OR REFRESH STREAMING TABLE
table_name
AS SELECT
*
FROM
cloud_files(
<path-to-uc-external-location>,
"json"
)
Python
@dlt.table(table_properties={"quality": "bronze"})
def table_name():
return (
spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json")
.load(f"{path_to_uc_external_location}")
)
具体化されたビューを共有する
既定では、パイプラインによって作成されたテーブルに対しては、パイプライン所有者のみがクエリを実行できます。 GRANT ステートメントを使用すると他のユーザーにテーブルに対してクエリを実行する機能を付与できます。また、REVOKE ステートメントを使用するとクエリ アクセスを取り消すことができます。 Unity Catalog での権限の詳細については、「Unity Catalog の権限の管理」を参照してください。
テーブルに SELECT 権限を付与する
GRANT SELECT ON TABLE
my_catalog.my_schema.table_name
TO
`user@databricks.com`
テーブルの SELECT 権限を取り消す
REVOKE SELECT ON TABLE
my_catalog.my_schema.table_name
FROM
`user@databricks.com`
テーブルの作成または具体化されたビューの作成権限を付与する
GRANT CREATE { MATERIALIZED VIEW | TABLE } ON SCHEMA
my_catalog.my_schema
TO
{ principal | user }
パイプラインの系列を表示する
Delta Live Tables パイプライン内のテーブルの系列は、カタログ エクスプローラーに表示されます。 Unity Catalog 対応パイプラインの具体化されたビューまたはストリーミング テーブルの場合は、カタログ エクスプローラー系列 UI にアップストリーム テーブルとダウンストリーム テーブルが表示されます。 Unity Catalog 系列の詳細については、「Unity Catalog を使用したデータ系列のキャプチャと表示」を参照してください。
Unity Catalog 対応 Delta Live Tables パイプラインの具体化されたビューまたはストリーミング テーブルの場合、カタログ エクスプローラー系列 UI は具体化されたビューまたはストリーミング テーブルを生成したパイプラインにも、そのパイプラインに現在のワークスペースからアクセスできる場合はリンクします。
ストリーミング テーブルのデータを追加、変更、または削除する
挿入、更新、削除、マージなどの データ操作言語 (DML) ステートメントを使用して、Unity Catalog に発行されたストリーミング テーブルを変更できます。 ストリーミング テーブルに対する DML クエリのサポートにより、一般データ保護規則 (GDPR) コンプライアンスのテーブルの更新などのユース ケースが可能になります。
Note
- ストリーミング テーブルのテーブル スキーマを変更する DML ステートメントはサポートされていません。 DML ステートメントがテーブル スキーマの進化を試みないことを確認します。
- ストリーミング テーブルを更新する DML ステートメントは、Databricks Runtime 13.3 LTS 以降を使用する共有 Unity Catalog クラスターまたは SQL ウェアハウスでのみ実行できます。
- ストリーミングには追加専用のデータソースが必要なため、処理で (DML ステートメントなどによる) 変更を伴うソース ストリーミング テーブルからのストリーミングが必要な場合は、ソース ストリーミング テーブルを読み取るときに skipChangeCommits フラグを設定します。
skipChangeCommits
が設定されていれば、ソース テーブルのレコードを削除または変更するトランザクションは無視されます。 処理にストリーミング テーブルが必要ない場合は、具体化されたビュー (追加専用の制限がない) をターゲット テーブルとして使用できます。
ストリーミング テーブル内のレコードを変更する DML ステートメントの例を次に示します。
特定の ID を持つレコードを削除します。
DELETE FROM my_streaming_table WHERE id = 123;
特定の ID を持つレコードを更新します。
UPDATE my_streaming_table SET name = 'Jane Doe' WHERE id = 123;