次の方法で共有


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

    指定されている場合は、ビューが作成されるか、既存のビューとその内容が更新されます。

  • プライベート

    プライベートの具体化されたビューを作成します。 プライベートの具体化されたビューは、パイプライン内の中間テーブルとして使用でき、これをカタログに発行したくない場合に便利です。

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

プライベートの具体化されたビューの作成には、以前は TEMPORARY パラメーターが使用されていました。

  • view_name

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

    プライベートの具体化されたビューは、カタログ内で発行されるオブジェクトと同じ名前を持つことができます。

  • column_list

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

    • column_name

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

    • 列タイプ

      列のデータ型を指定します。 Azure Databricks でサポートされているすべてのデータ型が、具体化されたビューでサポートされているわけではありません。

    • column_comment

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

    • column_constraint

      テーブルに流入するデータを検証する制約を追加します。 パイプラインの期待を使用してデータ品質を管理する方法については、を参照してください。

    • MASK 句

      重要

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

      列マスク関数を追加して、機密データを匿名化します。 「行フィルターと列マスクを使用して機密性の高いテーブル データをフィルター処理する」を参照してください。

  • テーブル制約

    重要

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

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

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

  • view_clauses

    必要に応じて、具体化されたビューのパーティション分割、コメント、ユーザー定義プロパティを指定します。 各サブ句は、1 回だけ指定できます。

    • DELTA の使用

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

      この句は省略可能で、既定値は DELTA です。

    • でパーティション分割

      テーブル内のパーティション分割に使用する 1 つ以上の列のリスト (省略可能)。 CLUSTER BY と相互に排他的です。

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

    • CLUSTER BY

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

      表に液体クラスタリングを使用するを参照してください。

    • 場所

      テーブル データの保存場所 (省略可能)。 設定されていない場合のシステムの既定値はパイプラインの保存場所となります。

      このオプションは、Hive メタストアに発行する場合にのみ使用できます。 Unity カタログでは、場所は自動的に管理されます。

    • コメント

      テーブルの説明 (省略可能)。

    • TBLPROPERTIES

      テーブルのテーブル プロパティのリスト (省略可能)。

    • で ROW FILTER

    重要

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

    行フィルター関数をテーブルに追加します。 それ以降のそのテーブルに対するクエリでは、行のうち、この関数による評価の結果が 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ではなくゼロを返します。
  • 列参照には別名は必須ではありません。 非列参照式には、次の例のように、別名が必要です。
    • 許容される: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 許容されない: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 有効なステートメントにするには、NOT NULLPRIMARY 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