具体化视图是预计算结果可用于查询的视图,并且可以更新以反映输入中的更改。 管道笔记本中定义的具体化视图由 DLT 管道提供支持。 每次更新具体化视图时,都会重新计算查询结果,以反映上游数据集中的变化。 可以手动或按计划更新具体化视图。
要详细了解如何执行或计划更新,请参阅在 DLT 管道上运行更新。
语法
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
一起指定。 如果未指定列类型,则会跳过列注释。-
添加一个约束,用于在数据流入表时验证数据。 请参阅通过管道预期管理数据质量。
-
重要
此功能目前以公共预览版提供。
添加列掩码函数以对敏感数据进行匿名化处理。 请参阅使用行筛选器和列掩码筛选敏感表数据。
-
table_constraint
重要
此功能目前以公共预览版提供。
指定架构时,可以定义主键和外键。 约束具备信息性,系统不会强制执行。 请参阅 SQL 语言参考中的 CONSTRAINT 子句。
注释
若要定义表约束,管道必须是启用了 Unity Catalog 的管道。
view_clauses
(可选)指定具体化视图的分区、注释和用户定义的属性。 每个子子句只能指定一次。
使用 DELTA
指定数据格式。 唯一的选项是 DELTA。
此子句是可选的,默认为 DELTA。
PARTITIONED BY
包含一列或多列的可选列表,用于对表进行分区。 与
CLUSTER BY
互斥。Liquid 聚类分析提供灵活的优化解决方案进行聚类分析。 请考虑对 DLT 使用
CLUSTER BY
而不是PARTITIONED BY
。CLUSTER BY
对表启用动态聚类,并定义要用作聚类键的列。 与
PARTITIONED BY
互斥。请参阅使用液体聚类分析 Delta 表。
LOCATION
表数据的可选存储位置。 如果未设置,系统将默认为管道存储位置。
仅当发布到 hms 时,此选项才可用。 在 uc 中,会自动管理位置。
评论
表的可选说明。
TBLPROPERTIES
表的表属性可选列表。
ROW FILTERWITH
重要
此功能目前以公共预览版提供。
向表中添加行筛选器函数。 将来对该表的查询会收到函数计算结果为 TRUE 的行的子集。 这对于精细的访问控制很有用,因为它允许函数检查调用用户的标识和组成员身份以决定是否筛选某些行。
请参阅
ROW FILTER
条款。查询
定义表数据集的 DLT 查询。
所需的权限
管道的运行方式用户必须具有以下权限:
- 对具体化视图引用的基表具有
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