次の方法で共有


Databricks SQL の具体化されたビューを使用する

重要

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

この記事では、Databricks SQL の具体化されたビューを作成して使用して、パフォーマンスを向上させ、データ処理と分析ワークロードのコストを削減する方法について説明します。

具体化されたビューとは

Databricks SQL では、具体化されたビューは Unity Catalog マネージド テーブルであり、ユーザーはソース テーブル内の最新バージョンのデータに基づいて結果を事前計算できます。 Azure Databricks 上の具体化されたビューは、具体化されたビューのクエリ時に常に結果を更新するのではなく、具体化されたビューが最後に更新されたときのデータの状態が返されるので、他の実装とは異なります。 具体化されたビューを手動で更新したり、更新をスケジュールしたりできます。

具体化されたビューは、抽出、変換、読み込み (ETL) 処理などのデータ処理ワークロードに対して強力です。 具体化されたビューは、コンプライアンス、修正、集計、または一般的な変更データ キャプチャ (CDC) のためにデータを処理するための単純な宣言型の方法を提供します。 具体化されたビューでは、低速クエリと頻繁に使用される計算を事前に計算することで、コストが削減されクエリの待機時間が短縮されます。 具体化されたビューでは、ベース テーブルのクリーニング、エンリッチ、非正規化によって、使いやすい変換も可能になります。 具体化されたビューは、場合によってはベース テーブルから変更を増分計算できるため、簡素化されたエンド ユーザー エクスペリエンスを提供しながらコストを削減できます。

具体化されたビューは、Delta Live Tables の立ち上げによって Databricks Data Intelligence Platform で最初にサポートされました。 Databricks SQL ウェアハウスで具体化されたビューを作成すると、具体化されたビューへの更新を処理する Delta Live Tables パイプラインが作成されます。 Delta Live Tables UI、Delta Live Tables API、または Delta Live Tables CLI で更新操作の状態を監視できます。 「具体化されたビューの更新の状態を表示する」を参照してください。

要件

  • 具体化されたビューを作成および更新するには、Unity Catalog 対応 Databricks SQL ウェアハウスを使用する必要があります。

  • ワークスペースは、サーバーレス対応リージョン内に存在する必要があります。

Databricks SQL で具体化されたビューを使用する場合の制限については、「制限事項」を参照してください。

具体化されたビューを作成する

具体化されたビューを作成するには、CREATE MATERIALIZED VIEW ステートメントを使用します。 Databricks SQL リファレンスの「CREATE MATERIALIZED VIEW」を参照してください。 CREATE ステートメントを送信するには、Azure Databricks UI の SQL エディターDatabricks SQL CLI、または Databricks SQL API を使用します。

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
  table1
GROUP BY
  date;

具体化されたビューはどのように作成されますか?

Databricks SQL 具体化されたビューの CREATE 操作では、Databricks SQL ウェアハウスを使用して、具体化されたビューでデータを作成し読み込みます。 具体化されたビューの作成は Databricks SQL ウェアハウスでの同期操作であるため、具体化されたビューが作成され最初のデータ読み込みが完了するまで CREATE MATERIALIZED VIEW コマンドはブロックされます。 Delta Live Tables パイプラインは、Databricks SQL 具体化されたビューごとに自動的に作成されます。 具体化されたビューが 更新されると、Delta Live Tables パイプラインの更新が開始され、更新が処理されます。

外部システムからデータを読み込む

Databricks では、 サポートされているデータ ソースについては Lakehouse フェデレーションを使用して外部データを読み込むことをおすすめします。 Lakehouse フェデレーションでサポートされていないソースからデータを読み込む方法については、データ形式のオプションに関するページを参照してください。

具体化されたビューを更新する

REFRESH 操作により、具体化されたビューが更新され、ベース テーブルに対する最新の変更が反映されます。 具体化されたビューを更新するには、REFRESH MATERIALIZED VIEW ステートメントを使用します。 Databricks SQL リファレンスの「REFRESH (MATERIALIZED VIEW と STREAMING TABLE)」を参照してください。 REFRESH ステートメントを送信するには、Azure Databricks UI の 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 パイプラインでは、継続またはトリガー実行モードが使われます。 具体化されたビューは、どちらの実行モードでも更新できます。 継続実行モードでの動作時に不要な処理を回避するため、パイプラインによって Delta 依存テーブルが自動的に監視され、それらの依存テーブルの内容が変更された場合にのみ更新が実行されます。 「Delta Live Tables パイプラインとは」を参照してください。

Note

Delta Live Tables ランタイムは、Delta 以外のデータ ソースでの変更を検出できません。 テーブルは引き続き定期的に更新されますが、過剰な再計算によってコンピューティングで行われる増分処理が遅くならないように、既定のトリガー間隔は長くなっています。

既定では、更新操作は同期的に実行されます。 更新操作を非同期的に実行するように設定することもできます。 各アプローチに関連する動作は次のとおりです。

  • 同期: 同期更新は、更新操作が完了するまで他の操作をブロックします。 これにより、ワークフローなどのオーケストレーション ツールで、更新操作を順番に処理できます。 ワークフローを使って具体化されたビューを調整するには、SQL タスクの種類を使います。 「Azure Databricks ワークフローの概要」を参照してください。
  • 非同期: 非同期更新は、具体化されたビューの更新が始まると Delta Live Tables コンピューティングでバックグラウンド ジョブを開始し、コマンドはデータの読み込みが完了する前に戻ります。 Delta Live Tables パイプラインは更新を管理するため、具体化されたビューの作成に使われる Databricks SQL ウェアハウスは使われません。 更新操作の間に実行する必要はありません。

一部のクエリは増分更新できます。 「具体化されたビューの更新操作」を参照してください。 増分更新を実行できない場合は、代わりに完全更新が実行されます。

具体化されたビューの更新をスケジュールする

定義されたスケジュールに基づいて自動的に更新されるように Databricks SQL 具体化されたビューを構成できます。 具体化されたビューを作成するとき、または ALTER VIEW ステートメントを使用してスケジュールを追加するときに、SCHEDULE 句を使用してこのスケジュールを構成します。 スケジュールが作成されると、更新を処理するように新しい Databricks ジョブが自動的に構成されます。 DESCRIBE EXTENDED ステートメントを使用すると、いつでもスケジュールを表示できます。

具体化されたビューの定義を更新する

具体化されたビューの定義を更新するには、最初に削除してから、具体化されたビューを再作成する必要があります。

具体化されたビューを削除する

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 を使用します。

具体化されたビューの更新の状態を表示する

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 でパイプラインを表示するには、パイプラインの [パイプラインの詳細] ページへのリンクに直接アクセスする必要があります。 リンクにアクセスするには、以下の方法があります。

  • SQL エディターREFRESH コマンドを送信した場合は、[結果] パネルのリンクをクリックします。
  • DESCRIBE EXTENDED ステートメントによって返されるリンクをクリックします。
  • 具体化されたビューの [系列] タブで、[パイプライン] をクリックし、パイプライン リンクをクリックします。

アクティブな更新を停止する

Delta Live Tables UI でアクティブな更新を停止するには、[パイプラインの詳細] ページで [停止] をクリックしてパイプラインの更新を停止します。 また、Databricks CLI、あるいは、Pipelines API の POST /api/2.0/pipelines/{pipeline_id}/stop 操作を使用して更新を停止することもできます。

具体化されたビューの所有者の変更

メタストア管理者とワークスペース管理者の両方である場合は、具体化されたビューの所有者を変更できます。具体化されたビューは、自動で Delta Live Tables パイプラインを作成して使用し、変更を処理します。 具体化されたビューの所有者を変更するには、次の手順に従います。

  • [ジョブ] アイコン[ワークフロー][Delta Live Tables] タブの順にクリックします。
  • 所有者を変更するパイプラインの名前をクリックします。
  • そのパイプライン名の右側にある Kebab メニュー ケバブメニューをクリックし、[権限] をクリックします。 [アクセス許可] ダイアログが開きます。
  • 現在の所有名の右側にある "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 イベント ログのクエリ実行」を参照してください。

増分更新と完全更新のどちらを使用するかを判断する

具体化されたビューの更新のパフォーマンスを最適化するために、Azure Databricks はコスト モデルを使用して、更新に使用される手法を選択します。 次の表では、これらの手法について説明します。

手法 増分更新を使用 説明
FULL_RECOMPUTE いいえ 具体化されたビューが完全に再計算されました
NO_OP 適用なし ベース テーブルに対する変更が検出されなかったため、具体化されたビューは更新されませんでした。
ROW_BASED または PARTITION_OVERWRITE はい 具体化されたビューは、指定された手法を使用して増分更新されました。

使用する手法を判断するには、event_typeplanning_information である Delta Live Tables イベント ログのクエリを実行します。

SELECT
  timestamp,
  message
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = 'planning_information'
ORDER BY
  timestamp desc;

<fully-qualified-table-name> を、カタログやスキーマなど、具体化されたビューの完全修飾名に置き換えます。

Delta Live Tables イベント ログのクエリ実行」を参照してください。

制限事項

  • VM を管理する方法とクエリを実行できる場所には、次の制限があります。

    • Databricks SQL の具体化されたビューは、プロ SQL ウェアハウスとサーバーレス SQL ウェアハウスでのみ作成および更新できます。
    • Databricks SQL の具体化されたビューは、それを作成したワークスペースからのみ更新できます。
    • Databricks SQL の具体化されたビューは、Databricks SQL ウェアハウス、Delta Live Tables、および Databricks Runtime 11.3 以降を実行する共有クラスターからのみクエリを実行できます。 単一ユーザー アクセス モード クラスターから具体化されたビューに対してクエリを実行することはできません。
  • 具体化されたビューでは、ID 列や代理キーはサポートされていません。

  • 具体化されたビューで NULL 許容列に対して合計集計が使用される場合に、その列に NULL 値のみが残っている場合、具体化されたビューの集計値は NULL ではなく 0 になります。

  • 具体化されたビューをサポートする基になるファイルには、具体化されたビュー定義に表示されないアップストリーム テーブルのデータ (個人を特定できる情報を含む) が含まれる場合があります。 このデータは、具体化されたビューの増分更新をサポートするために、基になるストレージに自動的に追加されます。 具体化されたビューの基になるファイルは、具体化されたビュー スキーマの一部ではないアップストリーム テーブルからデータを公開する可能性があるため、Databricks では、基になるストレージを信頼関係のないダウンストリーム コンシューマーと共有しないことをお勧めします。 たとえば、具体化されたビューの定義に COUNT(DISTINCT field_a) 句が含まれているとします。 具体化されたビュー定義には集計 COUNT DISTINCT 句のみが含まれていますが、基になるファイルには field_a の実際の値の一覧が含まれています。

  • Databricks SQL の具体化されたビューは、米国中南部と米国西部 2 のリージョンではサポートされていません。