メインコンテンツまでスキップ

CREATE MATERIALIZED VIEW (DLT)

マテリアライズドビュー は、事前計算された結果をクエリに使用でき、入力の変更を反映するように更新できるビューです。パイプライン ノートブックで定義されたマテリアライズドビューは、 DLT パイプラインによってサポートされます。 マテリアライズドビューが更新されるたびに、クエリ結果が再計算され、アップストリームデータセットの変更が反映されます。マテリアライズドビューは、手動またはスケジュールに従って更新できます。

更新を実行またはスケジュールする方法の詳細については、「 DLT パイプラインで更新を実行する」を参照してください。

構文

CREATE [OR REFRESH] [PRIVATE] MATERIALIZED VIEW
view_name
[ column_list ]
[ view_clauses ]
AS query

column_list
( { column_name column_type column_properties } [, ...]
[ column_constraint ] [, ...]
[ , table_constraint ] [...] )

column_properties
{ NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
{ USING DELTA |
PARTITIONED BY (col [, ...]) |
CLUSTER BY clause |
LOCATION path |
COMMENT view_comment |
TBLPROPERTIES clause |
WITH { ROW FILTER clause } } [...]

パラメーター

  • REFRESH

    指定した場合、ビューを作成するか、既存のビューとその内容を更新します。

  • プライベート

    プライベートマテリアライズドビューを作成します。 プライベート マテリアライズドビュー は、カタログに公開しないパイプライン内の中間テーブルとして役立ちます。

    • カタログには追加されず、定義パイプライン内でのみアクセスできます
    • カタログ内の既存のオブジェクトと同じ名前を持つことができます。パイプライン内で、プライベート マテリアライズドビューとカタログ内のオブジェクトの名前が同じ場合、その名前への参照はプライベート マテリアライズドビューに解決されます。
    • Private マテリアライズドビューは、1 回の更新だけでなく、パイプラインの有効期間全体にわたってのみ保持されます。

Private マテリアライズドビューは、以前は TEMPORARY パラメーターを使用して作成されていました。

  • view_name

    新しく作成されたビューの名前。完全修飾ビュー名は一意である必要があります。

    Private マテリアライズドビュー は、カタログで公開されているオブジェクトと同じ名前を付けることができます。

  • column_list

    必要に応じて、ビューのクエリ結果の列にラベルを付けます。列リストを指定する場合、列エイリアスの数はクエリ内の式の数と一致する必要があります。列リストが指定されていない場合、エイリアスはビューの本体から派生します。

    • column_name

      列名は一意で、クエリの出力列にマップする必要があります。

    • column_type

      列のデータ型を指定します。Databricksでサポートされているすべてのデータタイプがマテリアライズドビューでサポートされているわけではありません。

    • column_comment

      列を記述する省略可能な STRING リテラル。このオプションは、 column_typeと共に指定する必要があります。列タイプが指定されていない場合、列コメントはスキップされます。

    • column_constraint

      データがテーブルに流入するときにデータを検証する制約を追加します。「パイプラインの期待値を使用してデータ品質を管理する」を参照してください。

    • MASK 句

備考

プレビュー

この機能は パブリック プレビュー段階です。

機密データを匿名化するための列マスク機能を追加します。行フィルタと列マスクを使用した機密テーブル・データのフィルタを参照してください。

  • table_constraint
備考

プレビュー

この機能は パブリック プレビュー段階です。

スキーマを指定するときに、プライマリ・キーと外部キーを定義できます。制約は情報提供を目的としており、強制されません。SQL 言語リファレンスの CONSTRAINT 句 を参照してください。

注記

テーブルの制約を定義するには、パイプラインが Unity Catalog 対応パイプラインである必要があります。

  • view_clauses

    必要に応じて、マテリアライズドビューのパーティション化、コメント、およびユーザー定義プロパティを指定します。各 sub 句は一度だけ指定できます。

    • デルタの使用

      データ形式を指定します。唯一のオプションは DELTA です。

      この句はオプションで、デフォルトは DELTA です。

    • パーティション分割

      テーブルでのパーティション分割に使用する 1 つ以上の列のオプションのリスト。CLUSTER BYと相互に排他的です。

      リキッドクラスタリングは、クラスタリングのための柔軟で最適化されたソリューションを提供します。 DLT には PARTITIONED BY の代わりに CLUSTER BY を使用することを検討してください。

    • クラスター BY

      テーブルでリキッドクラスタリングを有効にし、クラスタリングキーとして使用する列を定義します。PARTITIONED BYと相互に排他的です。

      Deltaテーブルにリキッドクラスタリングを使用する」を参照してください。

    • 場所

      テーブルデータのオプションの格納場所。設定されていない場合、システムはデフォルトでパイプラインの保存場所を使用します。

      このオプションは、 HMSに公開する場合にのみ使用できます。 ucでは、位置情報は自動的に管理されます。

    • comment

      テーブルの説明(オプション)。

    • TBLプロパティ

      テーブルの テーブルプロパティ のオプションのリスト。

    • 行フィルター付き

備考

プレビュー

この機能は パブリック プレビュー段階です。

テーブルに行フィルター関数を追加します。そのテーブルに対する今後のクエリは、関数が TRUE と評価される行のサブセットを受け取ります。これは、関数が呼び出し元のユーザーの ID とグループメンバーシップを検査して、特定の行をフィルタリングするかどうかを決定できるため、きめ細かなアクセス制御に役立ちます。

ROW FILTERを参照してください。

  • クエリー

    テーブルのデータセットを定義する DLT クエリ。

必要な権限

パイプラインの実行ユーザーには、次のアクセス許可が必要です。

  • SELECT マテリアライズドビューによって参照されるベース テーブルに対する特権。
  • USE CATALOG 親カタログに対する権限と、親スキーマに対する USE SCHEMA 権限。
  • CREATE MATERIALIZED VIEW マテリアライズドビューのスキーマに対する権限。

マテリアライズドビューが定義されているパイプラインをユーザーが更新できるようにするには、次のものが必要です。

  • USE CATALOG 親カタログに対する権限と、親スキーマに対する USE SCHEMA 権限。
  • マテリアライズドビューの所有権、またはマテリアライズドビューの REFRESH 権限。
  • マテリアライズドビューの所有者は、マテリアライズドビューが参照するベース・テーブルに対する SELECT 権限を持っている必要があります。

ユーザーが結果のマテリアライズドビューをクエリできるようにするには、次のものが必要です。

  • USE CATALOG 親カタログに対する権限と、親スキーマに対する USE SCHEMA 権限。
  • SELECT マテリアライズドビューに対する特権。

制限

  • NULL 許容カラムに sum 集計があるマテリアライズドビューで、そのカラムから最後に NULL 以外の値が削除された場合 (したがって、そのカラムに残っている値は NULL つだけ)、マテリアライズドビューの結果の集計値は 0 を返します NULL

  • column-reference にはエイリアスは必要ありません。列以外の参照式には、次の例のようにエイリアスが必要です。

    • 許可: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 禁じられた: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • NOT NULL 有効なステートメントにするには、 PRIMARY KEY と共に手動で指定する必要があります。

  • マテリアライズドビューは、ID 列または代理キーをサポートしていません。

  • マテリアライズドビューは、 OPTIMIZE および VACUUM コマンドをサポートしていません。 メンテナンスは自動的に行われます。

  • テーブルの名前変更や所有者の変更はサポートされていません。

  • ジェネレーテッドカラム、ID 列、およびデフォルト列はサポートされていません。

SQL
-- Create a materialized view by reading from an external data source, using the default schema:
CREATE OR REFRESH MATERIALIZED VIEW taxi_raw
AS SELECT * FROM read_files("/databricks-datasets/nyctaxi/sample/json/")

-- Create a materialized view by reading from a dataset defined in a pipeline:
CREATE OR REFRESH MATERIALIZED VIEW filtered_data
AS SELECT
...
FROM taxi_raw

-- Specify a schema and clustering columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) CLUSTER BY (order_day_of_week, customer_id)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify partition columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) PARTITIONED BY (order_day_of_week)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a primary and foreign key constraint for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING NOT NULL PRIMARY KEY,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime)),
CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES main.default.customers(customer_id)
)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a row filter and mask clause for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales (
customer_id STRING MASK catalog.schema.customer_id_mask_fn,
customer_name STRING,
number_of_line_items STRING COMMENT 'Number of items in the order',
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
)
COMMENT "Raw data on sales"
WITH ROW FILTER catalog.schema.order_number_filter_fn ON (order_number)
AS SELECT * FROM sales_bronze