具体化されたレイク ビューの Spark SQL リファレンス

この記事では、Fabricでマテリアル化された湖のビューを作成、リストアップ、名前変更、削除するためのSpark SQL構文を提供します。

ヒント

最初の具体化された湖のビューを作成するには、「具体化された湖のビューを始める」を参照してください。

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

具体化された湖のビューは、任意のテーブルから、またはレイクハウス内の別の具体化された湖のビューから定義できます。

構文

CREATE [OR REPLACE] MATERIALIZED LAKE VIEW [IF NOT EXISTS] [workspace.lakehouse.schema].MLV_Identifier 
[( 
    CONSTRAINT constraint_name1 CHECK (condition expression1) [ON MISMATCH DROP | FAIL],  
    CONSTRAINT constraint_name2 CHECK (condition expression2) [ON MISMATCH DROP | FAIL] 
)]
[(
    REFRESH_HINT <hint_name> UNIQUE (<column1> [, <column2>, ...])
)]
[PARTITIONED BY (col1, col2, ... )] 
[COMMENT "description or comment"] 
[TBLPROPERTIES ("key1"="val1", "key2"="val2", ... )] 
AS select_statement 

注

論争

パラメーター 説明
OR REPLACE 既存の具体化されたレイク ビューを同じ名前で上書きします。 IF NOT EXISTSと組み合わせることはできません。
IF NOT EXISTS 具体化されたレイク ビューがまだ存在しない場合にのみ作成します。 ビューが既に定義されている場合、ステートメントはエラーなしで成功します。 OR REPLACEと組み合わせることはできません。
MLV_Identifier 可視化された湖の景観の名前。 workspace.lakehouse.schema.nameとして完全修飾できます。
CONSTRAINT ... CHECK データ品質ルールを定義します。 CHECK句は、各行が満たす必要があるブール式を指定します。 複数の制約を定義できます。
ON MISMATCH 行が制約に違反したときに実行するアクション。 DROP 行は自動的に削除されます。 FAIL は、エラーで更新を停止します。 既定値は FAIL です。
REFRESH_HINT 更新や削除の増分処理(プレビュー)を行うために、行を一意に識別する1つ以上の列を宣言します。
PARTITIONED BY 具体化されたレイク ビューをパーティション分割する列。フィルター処理された読み取りのクエリ パフォーマンスを向上させることができます。
COMMENT 具体化されたレイクビュー定義に格納されているフリーテキストの説明。
TBLPROPERTIES 具体化されたレイクビューにメタデータとして格納されるキーと値のペア。
AS select_statement 具体化されたレイク ビューのデータを定義する SELECT クエリ。

例示

次の例では、データ品質制約、コメント、パーティション分割を使用して具体化されたレイク ビューを作成します。 OR REPLACE句は、同じ名前の既存のビューを上書きします。

CREATE OR REPLACE MATERIALIZED LAKE VIEW silver.cleaned_order_data
(
    CONSTRAINT valid_quantity CHECK (quantity > 0) ON MISMATCH DROP
)
PARTITIONED BY (category)
COMMENT "Cleaned order data joined from products and orders"
AS SELECT 
    p.productID,
    p.productName,
    p.category,
    o.orderDate,
    o.quantity,
    o.totalAmount
FROM bronze.products p INNER JOIN bronze.orders o
ON p.productID = o.productID

次の例では、よりシンプルな具体化されたレイク ビューを作成します。 IF NOT EXISTS句は、ビューが既に存在する場合にエラーを防ぎ、デプロイ スクリプトに対して安全です。

CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS silver.products_with_sales AS
SELECT 
    p.productID,
    p.productName,
    p.category,
    CASE  
        WHEN COUNT(o.orderID) OVER (PARTITION BY p.productID) > 0 THEN TRUE  
        ELSE FALSE  
        END AS has_sales 
FROM bronze.products p LEFT JOIN bronze.orders o 
ON p.productID = o.productID

ヒント

レイクハウスからマテリアライズド レイク ビューの更新を管理する

具体化された湖のビューを作成した後は、ノートブックから更新を調整しないでください。 代わりに、Lakehouse で次の 2 つの組み込み機能を使用します。

  • データ系列: Fabric は、マテリアライズド レイク ビューの定義に基づいて、それらの依存順序を導き出します。 系列ビューを開くには、リボンの [ 具体化された湖のビュー ] タブを選択し、[ 管理] を選択します。 そこから、実行中の実行に従い、各ビューのアップストリームとダウンストリームの依存関係を調べることができます。
  • スケジュールされた更新: 同じ 管理 ビューから、具体化されたすべてのレイク ビューまたは選択したサブセットを更新する 1 つ以上のスケジュールを作成します。 各スケジュールは個別に実行され、依存関係の順序でビューが更新されるため、ダウンストリーム ビューは常にアップストリーム ビューから新しいデータを読み取ります。 Fabric が一時的なエラーを自動的に再試行します。

ノートブックを使用して、マテリアライズド レイクビューの定義を作成および反復改善します。 リネージュとスケジュールされた更新で順序付け、実行、再試行を処理し、信頼性の高い反復可能なデータを維持するコードを減らします。

USING OneLake_Files でファイルを取り込む

テーブルから物質化された湖のビューを定義するだけでなく、OneLakeからCSVやParquetファイルを直接取り込むものも定義できます。 ファイルインジェスティングビューは、物理的なOneLakeフォルダ、OneLakeフォルダのショートカット、または単一ファイルパスと組み合わせたUSING OneLake_Filesを使用します。 必要に応じて、FROM 句を使わない AS SELECT 句を使用して、取り込み時にソース データをフィルター処理し、整形し、集計できます。

以下の表は、各作成スタイルに適用される構文を示しています:

特徴 テーブルベースの実体化レイクビュー ファイルベースのマテリアライズドレイクビュー
Source テーブルまたはその他のマテリアライズド・レイクビュー 物理的なOneLakeフォルダ、OneLakeフォルダのショートカット、または単一ファイル
Definition AS select_statement USING OneLake_Files + OPTIONS + オプション FROM-less AS SELECT
形式 クエリ可能な任意のテーブル CSV、Parquet
スキーマ SELECT に由来する schema_mode = DYNAMIC または FIXED
源流系統 上流のテーブル/ビュー ソースの位置;行ごとのファイルトレーサビリティが必要な場合は、オプションで __filepath__ ソースメタデータ列を投影することもできます
典型的な層 銀、金 銅
データ品質制約 サポートされている 摂取時のサポート

構文

CREATE [OR REPLACE] MATERIALIZED LAKE VIEW [IF NOT EXISTS] [workspace.lakehouse.schema].MLV_Identifier
[(
    CONSTRAINT constraint_name CHECK (condition) ON MISMATCH DROP | FAIL
)]
USING OneLake_Files
OPTIONS (
    'format' = 'csv' | 'parquet',
    'path'   = 'abfss://<workspace>@<host>/<lakehouse>/Files/<folder-or-file>',
    ['header' = 'true' | 'false',]
    ['delimiter' = '<char>',]
    [...]
)
[PARTITIONED BY (column_name [, ...])]
[COMMENT "description"]
[TBLPROPERTIES (
    'schema_mode'  = 'DYNAMIC' | 'FIXED',
    'refresh_mode' = 'APPEND_ONLY' | 'FULL' | 'MIRROR'
)]
[AS SELECT select_expression [...] [WHERE condition]
    [GROUP BY expression [, ...]] [HAVING condition]]

注

ファイル取り込みAS SELECTにFROM条項を明記しないでください。 ソースはすでに USING OneLake_Files と path オプションに縛られています。

オプションリファレンス

オプション 対象 説明
format CSV、Parquet ソースファイル形式。 サポートされている値は、csv と parquetです。
path CSV、Parquet 物理的なOneLakeフォルダ、OneLakeフォルダショートカット、または単一ファイルのABFSSパス。 ネストされたサブフォルダ内のファイルは、ビュー作成時に再帰的に取り込まれます。 フォルダには尾部スラッシュを使い、1つのファイルには拡張子を入れてください。
header CSV 各ファイルの1行目に列名が含まれているかどうかを示します。 既定値は false です。
delimiter CSV フィールド区切り文字(例えば , または |)です。 デフォルトはコンマです。
sep CSV delimiter の別名。
quote CSV 値を引用符で囲むのに使用される文字。
escape CSV すでに引用された値の中の引用から抜け出すために使われる文字。
nullValue CSV null 値を表す文字列。
ignoreLeadingWhiteSpace CSV 値から先導スペースを取り除くかどうか。
ignoreTrailingWhiteSpace CSV 値から後尾のスペースを取り除くかどうか。
multiLine CSV 引用された値が複数の行にまたがることができるかどうか。 既定値は false です。
dateFormat CSV Java日付パターンは、MM/dd/yyyyなどの日付値を解析するために使われました。
timestampFormat CSV タイムスタンプの値を解析するために使われたJavaタイムスタンプパターン。
encoding CSV UTF-8、ISO-8859-1、UTF-16、Windows-1252などの文字エンコーディング。
comment CSV 行をコメントとしてマークし、スキップするための文字。
inferSchema CSV 列の種類を推測するかどうか。 false時には列が文字列として読み取られます。 推論を無効にするときはスキーマモード FIXED 使ってください。
columnNameOfCorruptRecord CSV 誤った行に対して生のテキストを受け取る文字列列の名前。 有効な行にはこの列に NULL が含まれています。 AS SELECT出力にその列を含めてください。

重要

Fabric は、不正な行の処理を管理します。 SparkのCSV mode オプションを設定しないでください。

TBLPROPERTIESの参考文献

財産 Values 説明
schema_mode DYNAMIC (既定値)、FIXED DYNAMIC は、新たに検出された列を追加し、ファイルに既存の列が含まれていない場合は NULL を書き込みます。 FIXED 作成時にスキーマをピン留めし、その後のドリフトを拒否します。
refresh_mode APPEND_ONLY、FULL、MIRROR フォルダの場合、 APPEND_ONLY は新しいファイルから行を追加し、現在のフォルダをスナップショットとして再処理 FULL 、 MIRROR ファイルの追加・削除を反映します。 シングルファイルソースは FULL リフレッシュセマンティクスを使用します。

Example

以下の例では、ヘッダー行を持つCSVファイルのフォルダをブロンズビューに取り込みます。 各行には、読み出したソースファイルを記録する __filepath__ 列も割り当てられます。

CREATE MATERIALIZED LAKE VIEW bronze.raw_orders
USING OneLake_Files
OPTIONS (
    'format' = 'csv',
    'path'   = 'abfss://SalesWorkspace@onelake.dfs.fabric.microsoft.com/SalesLake.Lakehouse/Files/orders/',
    'header' = 'true'
)
TBLPROPERTIES (
    'schema_mode'  = 'DYNAMIC',
    'refresh_mode' = 'APPEND_ONLY'
);

その後、bronze.raw_orders を選択元とする下流の Silver および Gold のマテリアライズド レイク ビューを構築できます。Fabric は依存関係を記録し、それらを順に更新します。 パイプライン内でファイルを追跡する方法については、Fabric のマテリアライズド レイク ビューのリネージを管理するを参照してください。

取り込み時にファイルをフィルタリング、変換、検証します

FROM-less AS SELECT を使って、列を選択し、行をフィルタリングし、値をキャストし、計算した列を追加し、データを集約し、ウィンドウ関数を適用できます。 ファイル取り込み制約は予測出力に対して実行されるため、制約は計算されたエイリアスを参照することができます。

以下の例は、誤った行をキャプチャし、行レベルのデータ品質ルールを適用し、入力をフィルタリングし、物質化された出力を分割しています。

CREATE MATERIALIZED LAKE VIEW silver.valid_orders
(
    CONSTRAINT positive_amount
        CHECK (order_amount > 0) ON MISMATCH DROP
)
USING OneLake_Files
OPTIONS (
    'format' = 'csv',
    'path' = 'abfss://SalesWorkspace@onelake.dfs.fabric.microsoft.com/SalesLake.Lakehouse/Files/orders/',
    'header' = 'true',
    'multiLine' = 'true',
    'dateFormat' = 'MM/dd/yyyy',
    'timestampFormat' = 'MM/dd/yyyy HH:mm:ss',
    'encoding' = 'ISO-8859-1',
    'comment' = '#',
    'columnNameOfCorruptRecord' = '_corrupt_record'
)
PARTITIONED BY (region)
COMMENT "Valid orders ingested from CSV"
TBLPROPERTIES (
    'schema_mode' = 'DYNAMIC',
    'refresh_mode' = 'FULL'
)
AS SELECT
    order_id,
    region,
    CAST(amount AS DECIMAL(18,2)) AS order_amount,
    CASE WHEN amount >= 1000 THEN 'high' ELSE 'standard' END AS order_band,
    _corrupt_record,
    __filepath__,
    current_timestamp() AS ingested_at;

調査または修復のためにキャプチャされた行を照会:

SELECT
    _corrupt_record,
    __filepath__,
    ingested_at
FROM silver.valid_orders
WHERE _corrupt_record IS NOT NULL;

ファイルから直接集約またはウィンドウ化された物質化された結果を作成することも可能です:

CREATE MATERIALIZED LAKE VIEW gold.sales_by_region
USING OneLake_Files
OPTIONS (
    'format' = 'parquet',
    'path' = 'abfss://SalesWorkspace@onelake.dfs.fabric.microsoft.com/SalesLake.Lakehouse/Files/sales/'
)
TBLPROPERTIES ('schema_mode' = 'DYNAMIC', 'refresh_mode' = 'FULL')
AS SELECT
    region,
    COUNT(*) AS order_count,
    SUM(amount) AS total_amount,
    AVG(amount) AS average_amount
GROUP BY region
HAVING SUM(amount) > 0;

対応可能な式には、標準的なSpark SQL演算、集計、統計、ウィンドウ、ランキング関数などがあります。

単一のファイルを取り込む

フォルダではなくCSVやParquetファイルに設定 path 。 単一ファイル ソースでは FULL の更新セマンティクスを使用するため、ファイルを置き換えると、マテリアライズされた結果も置き換えられます。

CREATE MATERIALIZED LAKE VIEW bronze.monthly_snapshot
USING OneLake_Files
OPTIONS (
    'format' = 'parquet',
    'path' = 'abfss://SalesWorkspace@onelake.dfs.fabric.microsoft.com/SalesLake.Lakehouse/Files/snapshots/2026-08.parquet'
)
TBLPROPERTIES (
    'schema_mode' = 'FIXED',
    'refresh_mode' = 'FULL'
);

注

スキーマFIXED使うと、最初のCREATE時点でソースフォルダに異なるスキーマの複数のファイルが含まれている場合、単一の固定スキーマを照合できないためビューが失敗します。 FIXEDビューは、同じスキーマを共有するファイルやDYNAMICを使うファイルに向けられます。 これは既知の制約であり、ショートカット変換における固定スキーマの挙動に似ています。

重要

生の空間や %20 を含むソースパスは現在受け入れられていません。 OneLakeフォルダのショートカットをソースとして使うことができます:Create はショートカットルートやネストされたフォルダで利用可能なファイルを取り込みます。 マネージドリフレッシュはショートカットルートに追加された新しいファイルを検出しますが、ネストされたショートカットフォルダに追加された新しいファイルは再帰的に検出しません。

ヒント

ソースフォルダ全体を必要に応じて再処理するには、 REFRESH MATERIALIZED LAKE VIEW <name> FULL;を実行します。 テーブルベースのビューと同様に、ノートブックからの継続的な更新をオーケストレーションせず、 Lineage と Scheduled Refresh を使って新しいファイルを自動で取得してください。

マテリアライズド・レイクビューの一覧を取得する

スキーマ内のすべての具体化されたレイク ビューの一覧を取得するには、次の構文を使用します。

SHOW MATERIALIZED LAKE VIEWS <IN/FROM> Schema_Name;

たとえば、 silver スキーマ内のすべての具体化されたレイク ビューを一覧表示するには、次のようにします。

SHOW MATERIALIZED LAKE VIEWS IN silver;

具体化されたレイク ビューを作成したステートメントを取得する

具体化されたレイク ビューの CREATE ステートメントを取得するには、次の構文を使用します。

SHOW CREATE MATERIALIZED LAKE VIEW MLV_Identifier;

たとえば、 products_with_salesの定義を取得するには、次のようにします。

SHOW CREATE MATERIALIZED LAKE VIEW products_with_sales;

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

具体化されたレイク ビューの定義 ( SELECT クエリ、制約、パーティション分割など) を変更するには、 CREATE または REPLACE コマンドを使用します。 または、既存のビューを 削除 して再作成することもできます。

マテリアライズド レイクビューの名前を変更する

既存の具体化されたレイク ビューの名前を変更するには、 ALTER MATERIALIZED LAKE VIEW コマンドを使用します。 構文は次のとおりです。

ALTER MATERIALIZED LAKE VIEW MLV_Identifier RENAME TO MLV_Identifier_New;

たとえば、 products_with_salesの名前を変更するには、次のようにします。

ALTER MATERIALIZED LAKE VIEW products_with_sales RENAME TO products_with_sales_v2;

注

ALTER MATERIALIZED LAKE VIEW コマンドは、名前の変更でのみサポートされます。 定義またはその他のプロパティ ( SELECT クエリ、制約、パーティション分割など) を変更するには、「 具体化されたレイク ビューを更新する」を参照してください。

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

具体化されたレイク ビューを削除するには、lakehouse オブジェクト エクスプローラーの [削除 ] オプションを使用するか、 DROP コマンドを実行します。 構文は次のとおりです。

DROP MATERIALIZED LAKE VIEW MLV_Identifier;

たとえば、 products_with_salesを削除するには、次のようにします。

DROP MATERIALIZED LAKE VIEW products_with_sales;

注

具体化されたレイク ビューの削除または名前変更は、系列ビューとスケジュールされた更新に影響します。 依存するすべてのマテリアライズド レイクビューの参照を必ず更新してください。

現在の制限

具体化されたレイク ビューの Spark SQL ステートメントには、次の制限事項が適用されます。

  • スキーマ名 - すべて大文字のスキーマ名 (たとえば、 MYSCHEMA) はサポートされていません。 大文字と小文字の混在またはすべて小文字を使用します。
  • データ操作言語 (DML) ステートメントはありません 。具体化されたレイク ビューに対して INSERT、 UPDATE、または DELETE ステートメントを実行することはできません。 データは、定義内の SELECT クエリによってのみ設定されます。
  • タイム トラベル クエリなし — 具体化されたレイク ビュー定義の SELECT クエリでは、Delta Lake タイム トラベル 構文 ( VERSION AS OF や TIMESTAMP AS OFなど) を使用できません。
  • ユーザー定義関数がありません 。 具体化されたレイク ビューを定義する SELECT クエリでは、ユーザー定義関数 (UDF) はサポートされていません。
  • ソースとしての一時ビューはありません 。 SELECT クエリでは、テーブルやその他の具体化されたレイク ビューを参照できますが、一時ビューは参照できません。
  • セッション レベルの Spark プロパティ — セッション レベルで設定された Spark 構成プロパティ (たとえば、 spark.conf.set(...)) は、スケジュールされた更新中には適用されません。 代わりに、レイクハウスまたはワークスペース レベルでプロパティを設定します。
  • ファイル取り込み — ファイルインジェストビューはCSVとParquetのみをサポートします。 FIXEDスキーマビューは、作成時にソースフォルダに異なるスキーマのファイルが格納されている場合に失敗します。 ソースパスはスペースを含めてはいけません。 OneLakeのフォルダショートカットはソースとしてサポートされていますが、マネージドリフレッシュはネストされたショートカットフォルダに追加されたファイルを再帰的に検出しません。