共用方式為


CREATE MATERIALIZED VIEW (管道)

具體化檢視 是一種檢視,其中預先計算的結果可供查詢使用,並可更新以反映輸入中的變更。 具體化檢視由管線支援。 每次更新具體化檢視時,都會重新計算查詢結果,以反映上游數據集中的變更。 您可以手動或依排程更新具現化視圖。

若要深入瞭解如何執行或排程更新,請參閱 執行管線更新

語法

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 參數建立私人具體化檢視。

  • view_name

    新建立的檢視的名稱。 完整檢視名稱必須唯一。

    私有物化視圖的名稱可以與目錄中發布的物件相同。

  • column_list

    選擇性地在檢視的查詢結果中標記數據行。 如果您提供資料行清單,數據行別名的數目必須符合查詢中的表達式數目。 如果未指定任何欄位清單,別名會從視圖的內容中衍生。

    • 欄位名稱

      數據行名稱必須是唯一的,且對應至查詢的輸出數據行。

    • 欄位類型

      指定數據行的數據類型。 具體化檢視不支援 Azure Databricks 支援的所有數據類型。

    • column_comment

      描述欄的可選 STRING 常值。 此選項必須與 column_type 一起指定。 如果未指定數據行類型,則會略過數據行批注。

    • column_constraint

      加入條件約束,以在數據流入數據表時驗證數據。 請參閱 使用管線期望來管理資料品質

    • MASK 子句

      這很重要

      這項功能目前處於 公開預覽版

      新增數據行遮罩函式來匿名敏感數據。 請參閱 行篩選和列遮罩

  • 資料表限制

    這很重要

    這項功能目前處於 公開預覽版

    指定架構時,您可以定義主鍵和外鍵。 條件約束是參考性的,不會強制執行。 請參閱 SQL 語言參考中的 CONSTRAINT 子句

    備註

    若要定義資料表約束條件,您的管線必須是已啟用 Unity 目錄的管線。

  • view_clauses

    可以選擇指定具現化視圖的分割、註釋和使用者自定義屬性。 每個次子句只能指定一次。

    • 使用 DELTA

      指定數據格式。 唯一的選項是 DELTA。

      這個子句是選填的,預設值為 DELTA。

    • 分區依據

      用於資料表分割的可選一個或多個欄位清單。 與 CLUSTER BY互斥。

      Liquid clustering 提供彈性且優化的叢集解決方案。 請考慮使用CLUSTER BY替代PARTITIONED BY以用於管線。

    • CLUSTER BY

      在數據表上啟用液體叢集,並定義要當做叢集索引鍵使用的數據行。 使用 CLUSTER BY AUTO 的自動叢集功能,Databricks 會智能地選擇叢集索引鍵,以優化查詢效能。 與 PARTITIONED BY互斥。

      請參閱 針對數據表使用液體叢集

    • 位置

      數據表數據的選擇性儲存位置。 如果未設定,系統會預設為管線儲存位置。

      只有在發佈至Hive中繼存放區時,才能使用此選項。 在 Unity 目錄中,位置會被自動管理。

    • 評論

      表格的可選描述。

    • TBLPROPERTIES

      可選的資料表屬性清單。

    • 與 ROW FILTER

    這很重要

    這項功能目前處於 公開預覽版

    將數據列篩選函式加入至數據表。 該數據表的未來查詢會接收其中函式評估為 TRUE 的資料列子集。 這適用於精細訪問控制,因為它可讓函式檢查叫用使用者的身分識別和群組成員資格,以決定是否篩選特定數據列。

    請參閱 ROW FILTER 條款

  • 查詢

    用於定義資料表資料集的查詢。

所需權限

管線的執行帳號必須具有下列許可權:

  • 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,才能成為有效的陳述式。
  • 具現化檢視不支援識別欄或代理索引鍵。
  • 具體化檢視不支援 OPTIMIZEVACUUM 命令。 自動進行維護。
  • 不支援重新命名資料表或變更擁有者。
  • 不支援產生的數據行、識別數據行和預設數據行。

範例

-- 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