具體化檢視 是一種檢視,其中預先計算的結果可供查詢使用,並可更新以反映輸入中的變更。 具體化檢視由管線支援。 每次更新具體化檢視時,都會重新計算查詢結果,以反映上游數據集中的變更。 您可以手動或依排程更新具現化視圖。
若要深入瞭解如何執行或排程更新,請參閱 執行管線更新。
語法
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一起指定。 如果未指定數據行類型,則會略過數據行批注。-
加入條件約束,以在數據流入數據表時驗證數據。 請參閱 使用管線期望來管理資料品質。
-
這很重要
這項功能目前處於 公開預覽版。
新增數據行遮罩函式來匿名敏感數據。 請參閱 行篩選和列遮罩。
-
資料表限制
這很重要
這項功能目前處於 公開預覽版。
指定架構時,您可以定義主鍵和外鍵。 條件約束是參考性的,不會強制執行。 請參閱 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 NULL和PRIMARY KEY,才能成為有效的陳述式。 - 具現化檢視不支援識別欄或代理索引鍵。
- 具體化檢視不支援
OPTIMIZE和VACUUM命令。 自動進行維護。 - 不支援重新命名資料表或變更擁有者。
- 不支援產生的數據行、識別數據行和預設數據行。
範例
-- 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