Databricks SQL の具体化されたビューを使用する
Note
具体化されたビューで Azure Private Link 接続を使う必要がある場合は、Databricks の担当者にお問い合わせください。
この記事では、Databricks SQL の具体化されたビューを作成して使用して、パフォーマンスを向上させ、データ処理と分析ワークロードのコストを削減する方法について説明します。
具体化されたビューとは
Databricks SQL では、具体化されたビューは Unity Catalog マネージド テーブルであり、ユーザーはソース テーブル内の最新バージョンのデータに基づいて結果を事前計算できます。 Azure Databricks 上の具体化されたビューは、具体化されたビューのクエリ時に常に結果を更新するのではなく、具体化されたビューが最後に更新されたときのデータの状態が返されるので、他の実装とは異なります。 具体化されたビューを手動で更新したり、更新をスケジュールしたりできます。
具体化されたビューは、抽出、変換、読み込み (ETL) 処理などのデータ処理ワークロードに対して強力です。 具体化されたビューは、コンプライアンス、修正、集計、または一般的な変更データ キャプチャ (CDC) のためにデータを処理するための単純な宣言型の方法を提供します。 具体化されたビューでは、低速クエリと頻繁に使用される計算を事前に計算することで、コストが削減されクエリの待機時間が短縮されます。 具体化されたビューでは、ベース テーブルのクリーニング、エンリッチ、非正規化によって、使いやすい変換も可能になります。 具体化されたビューは、場合によってはベース テーブルから変更を増分計算できるため、簡素化されたエンド ユーザー エクスペリエンスを提供しながらコストを削減できます。
具体化されたビューは、Delta Live Tables のローンチと共に Azure Databricks で最初にサポートされました。 Databricks SQL ウェアハウスで具体化されたビューを作成すると、 具体化されたビューへの更新を処理するサーバーレス パイプライン が作成されます。 Delta Live Tables UI またはパイプライン API で更新操作の状態を監視できます。 「具体化されたビューの更新の状態を表示する」を参照してください。
要件
具体化されたビューを作成または更新するには:
Unity Catalog 対応の プロ またはサーバーレス SQL ウェアハウスを使用する必要があります。
具体化されたビューを更新するには、それを作成したワークスペース内にいる必要があります。
ワークスペースは、サーバーレス SQL ウェアハウスをサポートするリージョンに存在する必要があります。
具体化されたビューに対してクエリを実行するには:
- 具体化されたビューの所有者であるか、具体化されたビューでの
SELECT
と、その親でのUSE SCHEMA
およびUSE CATALOG
を持っている必要があります。 - 以下のいずれかのコンピューティング リソースを使用する必要があります。
- SQL ウェアハウス
- Delta Live Tables インターフェイス
- 共有アクセス モード コンピューティング
- ワークスペースがサーバーレス コンピューティングに対して有効になっている限り、Databricks Runtime 15.4 以降のシングル ユーザー アクセス モード。 シングル ユーザー コンピューティングでのきめ細かなアクセス制御に関するページを参照してください。
- 具体化されたビューの所有者である場合にのみ:14.3 から 15.3 の間で Databricks Runtime を実行している単一ユーザー アクセス モードのコンピューティング リソース。
具体化されたビューの使用に関するその他の制限を確認するには、「制限事項」を参照してください。
具体化されたビューを作成する
Databricks SQL 具体化されたビューの CREATE
操作では、Databricks SQL ウェアハウスを使用して、具体化されたビューでデータを作成し読み込みます。 具体化されたビューの作成は同期操作であるため、具体化されたビューが作成され最初のデータ読み込みが完了するまで CREATE MATERIALIZED VIEW
コマンドはブロックされます。 サーバーレス Delta Live Tables パイプラインは、Databricks SQL 具体化されたビューごとに自動的に作成されます。 具体化されたビューが 更新 されると、Delta Live Tables パイプラインが更新を処理します。
具体化されたビューを作成するには、CREATE MATERIALIZED VIEW
ステートメントを使用します。 CREATE ステートメントを送信するには、Azure Databricks UI の SQL エディター、Databricks SQL CLI、または Databricks SQL API を使用します。
create ステートメントが実行されるランタイム チャネルを選択するには、値を TBLPROPERTIES
〗または "CURRENT"
〘 に設定した句を"PREVIEW"
使用します。 既定値は "CURRENT"
です。 Delta Live Tables チャネルの詳細については、「Delta Live Tables ランタイム チャネル」を参照してください。 構文とパラメーターの詳細については、「具体化されたビューを作成」を参照してください。
Note
具体化されたビューを作成するユーザーは具体化されたビューの所有者であり、次のアクセス許可を持っている必要があります。
- 具体化されたビューによって参照されるベース テーブルに対する
SELECT
権限。 - 具体化されたビューのソース テーブルを含むカタログとスキーマに対する
USE CATALOG
およびUSE SCHEMA
権限。 - 具体化されたビューのターゲット カタログとスキーマに対する
USE CATALOG
およびUSE SCHEMA
権限。 - 具体化されたビューを含むスキーマに対する
CREATE TABLE
およびCREATE MATERIALIZED VIEW
権限。
次の例では、基本テーブル base_table1
から具体化されたビュー mv1
を作成します。
CREATE MATERIALIZED VIEW mv1
AS SELECT
date, sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
外部システムからデータを読み込む
Databricks では、 サポートされているデータ ソースについては Lakehouse フェデレーションを使用して外部データを読み込むことをおすすめします。 Lakehouse フェデレーションでサポートされていないソースからデータを読み込む方法については、データ形式のオプションに関するページを参照してください。
具体化されたビューを更新する
REFRESH
操作により、具体化されたビューが更新され、ベース テーブルに対する最新の変更が反映されます。 操作は既定では同期的で、更新操作が完了するまでコマンドがブロックされます。 具体化されたビューを更新するには、REFRESH MATERIALIZED VIEW
ステートメントを使用します。 このコマンドの SQL 構文とパラメーターの詳細については、「(具体化されたビューまたはストリーミングテーブル)を更新する」を参照してください。 増分更新できる具体化されたビューの種類の詳細については、「具体化されたビューの増分更新」を参照してください。
更新ステートメントを送信するには、Azure Databricks UI の SQL エディター、SQL 倉庫に接続されたノートブック、Databricks SQL CLI、または Databricks SQL API を使用します。
具体化されたビューを REFRESH
できるのは所有者だけです。
次の例では、具体化されたビュー mv1
を更新します。
REFRESH MATERIALIZED VIEW mv1;
Databricks SQL 具体化されたビューはどのように更新されますか?
具体化されたビューは、更新操作を処理するために Delta Live Tables パイプラインを自動的に作成して使います。 更新は Delta Live Tables パイプラインによって管理され、アップデートは具体化されたビューの作成に使用される Databricks SQL 倉庫によって監視されます。 具体化されたビューは、スケジュールに従って実行される Delta Live Tables パイプラインを使用して更新できます。 トリガーされたパイプライン モードと連続パイプライン モードを参照してください。
Note
Delta Live Tables ランタイムは、Delta 以外のデータ ソースでの変更を検出できません。 テーブルは引き続き定期的に更新されますが、過剰な再計算によってコンピューティングで行われる増分処理が遅くならないように、既定のトリガー間隔は長くなっています。
既定では、更新操作は同期的に実行されます。 更新操作を非同期的に実行するように設定することもできます。 これは、refresh コマンドを使用して設定できます。 REFRESH (MATERIALIZED VIEW または STREAMING TABLE) を参照してください。各アプローチに関連する動作は次のとおりです。
- 同期: 同期更新では、更新が完了するまで他の操作が続行されなくなります。 Databricks ジョブなどのオーケストレーション ツールで更新操作をシーケンス処理する場合など、次の手順で結果が必要な場合は、同期更新を使用します。 マテリアライズド ビューをジョブと調整するには、SQL タスクの種類を使用します。 「ワークフローのスケジュールとオーケストレーション」を参照してください。
- 非同期: 非同期更新では、具体化されたビューの更新が開始されたときに Delta Live Tables コンピューティングでバックグラウンド ジョブが開始され、データ読み込みが完了する前にコマンドが戻ります。 この更新の種類は、操作が必ずしもコマンドが開始されるウェアハウスのコンピューティング容量を保持するとは限らないため、コストを節約できます。 更新がアイドル状態になり、他のタスクが実行されていない場合、更新で他の使用可能なコンピューティングが使用されている間は、ウェアハウスをシャットダウンできます。 さらに、非同期更新では、複数の操作を並列で開始できます。
一部のクエリは増分更新できます。 具体化されたビューについては、「増分更新」を参照してください。 増分更新を実行できない場合は、代わりに完全更新が実行されます。
具体化されたビューの更新をスケジュールする
定義されたスケジュールに基づいて自動的に更新されるように Databricks SQL 具体化されたビューを構成できます。 スケジュールをセットするには、次のいずれかの操作を行います。
- 具体化されたビューを作成する 場合、
SCHEDULE
句を使用してスケジュールを設定する - 具体化されたビューの変更 ステートメントを使用してスケジュールを追加します。
スケジュールが作成されると、更新を処理するように新しい Databricks ジョブが自動的に構成されます。
スケジュールを表示するには、次のいずれかを実行します。
- Azure Databricks UI で SQL エディターから
DESCRIBE EXTENDED
ステートメントを実行します。 - カタログ エクスプローラーを使用して具体化されたビューを表示します。 スケジュールは [概要] タブの 更新状態 に表示されます。 「カタログ エクスプローラーとは」を参照してください。
具体化されたビューの更新の状態を表示する
Note
Delta Live Tables パイプラインが具体化されたビューの更新を管理するため、パイプラインの起動時間によって待機時間が発生します。 この時間は、更新の実行に必要な時間に加えて、数秒から数分かかる場合があります。
Delta Live Tables UI で具体化されたビューを管理するパイプラインを表示するか、具体化されたビューの DESCRIBE EXTENDED
コマンドによって返される更新情報を表示することで、具体化されたビューの更新の状態を表示できます。
Delta Live Tables イベント ログのクエリを実行して、具体化されたビューの更新履歴を表示することもできます。 「具体化されたビューの更新履歴を表示する」を参照してください。
Delta Live Tables UI で更新の状態を表示する
既定では、具体化されたビューを管理する Delta Live Tables パイプラインは Delta Live Tables UI には表示されません。 Delta Live Tables UI でパイプラインを表示するには、パイプラインの [パイプラインの詳細] ページへのリンクに直接アクセスする必要があります。 リンクにアクセスするには、以下の方法があります。
DESCRIBE EXTENDED
ステートメントによって返されるテーブルの 最新の更新 行に表示されているリンクをコピーして貼り付けます。- 具体化されたビューの [系列] タブで、[パイプライン] をクリックし、パイプライン リンクをクリックします。
Azure Databricks UI で SQL エディターを使用して送信された非同期 REFRESH
コマンドの場合は、結果 パネルに表示されているリンクに従って更新の状態を表示できます。
アクティブな更新を停止する
Delta Live Tables UI でアクティブな更新を停止するには、[パイプラインの詳細] ページで [停止] をクリックしてパイプラインの更新を停止します。 また、Databricks CLI、あるいは、Pipelines API の POST /api/2.0/pipelines/{pipeline_id}/stop 操作を使用して更新を停止することもできます。
具体化されたビューの定義を更新する
具体化されたビューの定義を更新するには、最初に削除してから、具体化されたビューを再作成する必要があります。
具体化されたビューを削除する
Note
具体化されたビューを削除するコマンドを削除するには、その具体化されたビューの所有者である必要があります。
具体化されたビューを削除するには、DROP VIEW ステートメントを使用します。 DROP
ステートメントを送信するには、Azure Databricks UI の SQL エディター、Databricks SQL CLI、または Databricks SQL API を使用できます。 次の例では、具体化されたビュー mv1
を削除します。
DROP MATERIALIZED VIEW mv1;
具体化されたビューの情報を見る
具体化されたビューの列とデータ型を取得するには、DESCRIBE
ステートメントを使用します。 具体化されたビューの列、データ型、および所有者、場所、作成時刻、更新状態などのメタデータを取得するには、DESCRIBE EXTENDED
を使用します。 DESCRIBE
ステートメントを送信するには、Azure Databricks UI の SQL エディター、Databricks SQL CLI、または Databricks SQL API を使用します。
具体化されたビューの所有者の変更
メタストア管理者とワークスペース管理者の両方である場合は、具体化されたビューの所有者を変更できます。具体化されたビューは、自動で Delta Live Tables パイプラインを作成して使用し、変更を処理します。 具体化されたビューの所有者を変更するには、次の手順に従います。
- 具体化されたビューの [系列] タブで、[パイプライン] をクリックし、パイプライン リンクをクリックします。
- そのパイプライン名の右側にある ケバブメニューをクリックし、[権限] をクリックします。 [アクセス許可] ダイアログが開きます。
- 現在の所有名の右側にある "x" をクリックして現在の所有者を削除します。
- 入力を開始して選択可能なユーザーの一覧をフィルター処理することもできます。 新しいパイプライン所有者にするユーザーをクリックします。
- [保存] をクリックして変更を保存し、ダイアログを閉じます。
パイプラインで定義された具体化されたビューを含むすべてのパイプライン資産は、新しいパイプライン所有者によって所有されます。 すべての将来の更新は、所有者の ID を使用して実行されます。
具体化されたビューへのアクセスを制御する
具体化されたビューでは、プライベート データの公開を回避しながら、データ共有をサポートする豊富なアクセス制御がサポートされています。 具体化されたビューの所有者は、他のユーザーに SELECT
権限を付与できます。 具体化されたビューへの SELECT
アクセスを持つユーザーは、具体化されたビューによって参照されるテーブルへの SELECT
アクセスを必要としません。 このアクセス制御により、基になるデータへのアクセスを制御しながらデータ共有が可能になります。
具体化されたビューへの権限を付与する
具体化されたビューへのアクセスを許可するには、GRANT
ステートメントを使用します。
GRANT
privilege_type [, privilege_type ] ...
ON <mv_name> TO principal;
privilege_type は次のとおりです。
SELECT
- ユーザーは具体化されたビューをSELECT
できます。REFRESH
- ユーザーは具体化されたビューをREFRESH
できます。 更新は、所有者のアクセス許可を使用して実行されます。
次の例では、具体化されたビューを作成し、選択および更新の特権をユーザーに付与します。
CREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;
具体化されたビューから権限を取り消す
具体化されたビューからアクセスを取り消すには、REVOKE
ステートメントを使用します。
REVOKE
privilege_type [, privilege_type ]
ON <name> FROM principal;
具体化されたビューの所有者または具体化されたビューに対する SELECT
権限が付与されている他のユーザーからベース テーブルに対する SELECT
権限が取り消された場合、あるいはベース テーブルが削除された場合においても、具体化されたビューの所有者またはアクセス権を付与されたユーザーは、具体化されたビューに対するクエリを実行できます。 ただし、次の動作が発生します。
- 具体化されたビューの所有者または具体化されたビューへのアクセスを失った他のユーザーは、その具体化されたビューに対し
REFRESH
を実行できなくなり、具体化されたビューは古くなります。 - スケジュールが自動化されている場合、次にスケジュールされた
REFRESH
は失敗するか、実行されません。
次の例では、mv1
から SELECT
権限を取り消します。
REVOKE SELECT ON mv1 FROM user1;
変更データ フィードを有効にする
特定の高度なユース ケースを除き、具体化されたビューのベース テーブルでは変更データ フィードが必要です。 ベース テーブルで変更データ フィードを有効にするには、次の構文を使用して delta.enableChangeDataFeed
テーブル プロパティを設定します。
ALTER TABLE table1 SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
具体化されたビューの更新履歴を表示する
現在および過去の更新など、具体化されたビューに対する REFRESH
操作の状態を表示するには、Delta Live Tables イベント ログのクエリを実行します。
SELECT
*
FROM
event_log(TABLE(<fully-qualified-table-name>))
WHERE
event_type = "update_progress"
ORDER BY
timestamp desc;
<fully-qualified-table-name>
を、カタログやスキーマなど、具体化されたビューの完全修飾名に置き換えます。
「Delta Live Tables イベント ログのクエリ実行」を参照してください。
制限事項
- コンピューティングとワークスペースの要件については、「要件」を参照してください。
- 具体化されたビューでは、ID 列や代理キーはサポートされていません。
- 具体化されたビューで
NULL
許容列に対して合計集計が使用される場合に、その列にNULL
値のみが残っている場合、具体化されたビューの集計値はNULL
ではなく 0 になります。 - 具体化されたビューから変更データ フィードを読み取ることはできません。
- 具体化されたビューをサポートする基になるファイルには、具体化されたビュー定義に表示されないアップストリーム テーブルのデータ (個人を特定できる情報を含む) が含まれる場合があります。 このデータは、具体化されたビューの増分更新をサポートするために、基になるストレージに自動的に追加されます。 具体化されたビューの基になるファイルは、具体化されたビュー スキーマの一部ではないアップストリーム テーブルからデータを公開する可能性があるため、Databricks では、基になるストレージを信頼関係のないダウンストリーム コンシューマーと共有しないことをお勧めします。 たとえば、具体化されたビューの定義に
COUNT(DISTINCT field_a)
句が含まれているとします。 具体化されたビュー定義には集計COUNT DISTINCT
句のみが含まれていますが、基になるファイルにはfield_a
の実際の値の一覧が含まれています。