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

CREATE MATERIALIZED VIEW (Lakeflow 宣言型パイプライン)

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

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

構文

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

    指定すると、ビューが作成されるか、既存のビューとそのコンテンツが更新されます。

  • プライベート

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

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

    プライベート マテリアライズドビューは以前にTEMPORARYで作成されました。

  • ビュー名

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

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

  • 列リスト

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

    • 列名

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

    • 列タイプ

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

    • 列コメント

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

    • 列制約

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

    • MASK句

備考

プレビュー

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

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

  • テーブル制約
備考

プレビュー

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

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

注記

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

  • ビュー句

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

    • デルタの使用

      データ形式を指定します。唯一の選択肢はDELTAです。

      この句はオプションであり、デフォルトは DELTA になります。

    • パーティション分割

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

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

    • クラスター BY

      テーブルで流動クラスタリングを有効にし、クラスタリング キーとして使用する列を定義します。 CLUSTER BY AUTOで自動流体クラスタリングを使用すると、 Databricksインテリジェントにクラスタリング キーを選択してクエリのパフォーマンスを最適化します。 PARTITIONED BYと相互に排他的です。

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

    • 場所

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

      このオプションは、 Hive metastoreに公開する場合にのみ使用できます。 Unity Catalog では、場所は自動的に管理されます。

    • comment

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

    • テーブルプロパティ

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

    • 行フィルター付き

備考

プレビュー

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

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

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

  • クエリー

    テーブルのデータセットを定義する Lakeflow 宣言型パイプライン クエリ。

必要な権限

パイプラインの実行ユーザーには、次の権限が必要です。

  • SELECT マテリアライズドビューが参照する実表に対する権限。
  • USE CATALOG 親カタログに対する権限と親スキーマに対するUSE SCHEMA権限。
  • CREATE MATERIALIZED VIEW マテリアライズドビューのスキーマに対する権限。

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

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

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

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

制限事項

  • NULL 可能な列に対するsum集計を含むマテリアライズドビューで、その列から最後の非 NULL 値が削除され、その列にNULL値のみが残る場合、マテリアライズドビューの結果の集計値は、 NULLではなく 0 を返します。

  • 列参照には別名は必要ありません。列以外の参照式には、次の例のように別名が必要です。

    • 許可された: 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 列または代理キーをサポートしていません。

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

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

  • ジェネレーテッドカラム、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