具体化されたビューは、事前計算済みの結果をクエリに使用できるビューであり、入力の変更を反映するように更新できます。 具体化されたビューはパイプラインによってサポートされます。 具体化されたビューが更新されるたびに、クエリ結果が再計算されてアップストリームのデータセットでの変更が反映されます。 具体化されたビューは、手動またはスケジュールに従って更新できます。
更新を実行またはスケジュールする方法の詳細については、「 パイプライン更新の実行」を参照してください。
構文
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 |
REFRESH POLICY refresh_clause |
WITH { ROW FILTER clause } } [...]
パラメーター
REFRESH
指定されている場合は、ビューが作成されるか、既存のビューとその内容が更新されます。
プライベート
プライベートの具体化されたビューを作成します。 プライベートの具体化されたビューは、パイプライン内の中間テーブルとして使用でき、これをカタログに発行したくない場合に便利です。
- これらはカタログに追加されず、定義したパイプライン内でのみアクセスできます。
- カタログ内の既存のオブジェクトと同じ名前を持つことができます。 パイプライン内で、プライベートの具体化されたビューとカタログ内のオブジェクトが同じ名前を持つ場合は、この名前への参照を解決した結果はプライベートの具体化されたビューとなります。
- プライベートの具体化されたビューは、1 回の更新中だけではなく、そのパイプラインの有効期間全体にわたって存続します。
プライベートの具体化されたビューの作成には、以前は
TEMPORARYパラメーターが使用されていました。view_name
新しく作成されたビューの名前。 完全修飾のビュー名は一意にする必要があります。
プライベートの具体化されたビューは、カタログ内で発行されるオブジェクトと同じ名前を持つことができます。
column_list
必要に応じて、ビューのクエリ結果内の列にラベルを付けます。 列の一覧を指定する場合は、列の別名の数がクエリ内の式の数と一致している必要があります。 列リストが指定されていない場合、別名はビューの本体から派生します。
-
列名は一意である必要があり、かつクエリの出力列にマップされている必要があります。
列タイプ
列のデータ型を指定します。 Azure Databricks でサポートされているすべてのデータ型が、すべての具体化されたビューでサポートされているわけではありません。
column_comment
列を記述する任意の
STRINGリテラル。 このオプションは、column_typeと共に指定する必要があります。 列の種類が指定されていない場合、列コメントはスキップされます。-
テーブルに流入するデータを検証する制約を追加します。 パイプラインの期待を使用してデータ品質を管理する方法については、を参照してください。
-
列マスク関数を追加して、機密データを匿名化します。 「行フィルターと列マスク」を参照してください。
-
テーブル制約
スキーマを指定するときに、主キーと外部キーを定義できます。 制約は情報提供のみを目的としており、強制されるものではありません。 SQL 言語リファレンスの CONSTRAINT 句 を参照してください。
注
テーブル制約を定義するには、パイプラインが Unity Catalog 対応のパイプラインである必要があります。
view_clauses
必要に応じて、具体化されたビューのパーティション分割、コメント、ユーザー定義プロパティを指定します。 各サブ句は、1 回だけ指定できます。
DELTA の使用
データ形式を指定します。 オプションは DELTA のみです。
この句は省略可能で、既定値は DELTA です。
でパーティション分割
テーブル内のパーティション分割に使用する 1 つ以上の列のリスト (省略可能)。
CLUSTER BYと相互に排他的です。液体クラスタリングは、クラスタリング用の柔軟で最適化されたソリューションを提供します。 パイプラインに
CLUSTER BYするのではなく、PARTITIONED BYを使用することを検討してください。CLUSTER BY
リキッド クラスタリングをテーブルに対して有効化し、クラスタリング キーとして使用する列を定義します。
CLUSTER BY AUTOで自動液体クラスタリングを使用し、Databricks はクエリのパフォーマンスを最適化するためにクラスタリング キーをインテリジェントに選択します。PARTITIONED BYと相互に排他的です。表に液体クラスタリングを使用するを参照してください。
場所
テーブル データの保存場所 (省略可能)。 設定されていない場合のシステムの既定値はパイプラインの保存場所となります。
このオプションは、Hive メタストアに発行する場合にのみ使用できます。 Unity カタログでは、場所は自動的に管理されます。
コメント
テーブルの説明 (省略可能)。
TBLPROPERTIES
テーブルのテーブル プロパティのリスト (省略可能)。
REFRESH ポリシー
(ベータ)必要に応じて、具体化されたビューの更新ポリシーを設定します。
POLICY 句 (パイプライン) REFRESH参照してください。
で ROW FILTER
行フィルター関数をテーブルに追加します。 それ以降のそのテーブルに対するクエリでは、行のうち、この関数による評価の結果が TRUE であるものだけが返されます。 これは、細粒度のアクセス制御に役立ちます。呼び出し元ユーザーの ID とグループ メンバーシップをその関数で検査した結果として、特定の行をフィルター処理するかどうかを決定できるからです。
ROW FILTERの条項を参照してください。
クエリ
テーブルのデータセットを定義するクエリ。
必要なアクセス許可
パイプラインの実行時のユーザーには、次のアクセス許可が必要です。
- 具体化されたビューによって参照されるベース テーブルに対する
SELECT特権。 - 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - 具体化されたビューを含むスキーマに対する
CREATE TABLEおよびCREATE MATERIALIZED VIEW権限。
パイプラインの中で具体化されたビューが定義されている場合に、そのパイプラインを更新するユーザーには、次のものが必要です。
- 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - 具体化されたビューの所有権、または具体化されたビューに対する
REFRESH特権。 - 具体化されたビューの所有者は、具体化されたビューで参照されるベース テーブルに対する
SELECT特権が付与されている必要があります。
結果として得られた具体化されたビューに対してクエリを実行するユーザーには、次のものが必要です。
- 親カタログに対する
USE CATALOG特権と、親スキーマに対するUSE SCHEMA特権。 - 具体化されたビューに対する
SELECT特権。
制限事項
- NULL 許容列に対する
sum集計を含む具体化されたビューで、最後の NULL 非許容値がその列から削除され、その列に残っているのがNULL値のみである場合、具体化されたビューの結果の集計値は、NULLではなくゼロを返します。 - 列参照に別名は必要ありません。 次の例のように、非列参照式には別名が必要です。
- 許可:
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 列、既定の列はサポートされていません。
例示
-- 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