本文介绍如何在 Databricks SQL 中创建和刷新具体化视图,以提高性能和降低数据处理和分析工作负荷的成本。
什么是具体化视图?
在 Databricks SQL 中,具体化视图是以物理方式存储查询结果的 Unity 目录托管表。 与按需计算结果的标准视图不同,具体化视图会缓存结果,并在基础源表发生更改时更新它们,无论是按计划还是自动更改。
具体化视图非常适合用于数据处理工作负载,例如提取、转换和加载(ETL)处理。 具体化视图提供了一种简单的声明性方法,用于处理数据以实现合规、更正、聚合或变更数据捕获 (CDC)。 具体化视图还通过清理、扩充和反规范化基表来实现易于使用的转换。 通过预先计算昂贵的或常用查询,具体化视图降低了查询延迟和资源消耗。 在许多情况下,他们可以增量计算源表 的更改 ,进一步提高效率和最终用户体验。
下面是具体化视图的常见用例:
- 使用最少的最终用户查询延迟使 BI 仪表板保持最新状态。
- 使用简单的 SQL 逻辑减少复杂的 ETL 业务流程。
- 构建复杂的分层转换。
- 任何需要一致性能和最新见解的用例。
在 Databricks SQL 仓库中创建具体化视图时,会创建 无服务器管道 来处理创建并刷新具体化视图。 可以在目录资源管理器中监视刷新操作的状态。 请参阅使用 DESCRIBE EXTENDED
查看具体化视图详细信息。
要求
在 Databricks SQL 中创建的物化视图由无服务器管道支持。 工作区必须支持无服务器管道才能使用此功能。
创建或刷新具体化视图的要求:
必须使用已启用 Unity Catalog 的专业或无服务器 SQL 仓库。
要刷新具体化视图,必须位于创建具体化视图的工作区中。
若要从 Delta 表以增量方式刷新具体化视图,源表必须 启用行跟踪。
所有者(创建具体化视图的用户)必须具有以下权限:
- 对具体化视图引用的基表的
SELECT
特权。 - 对包含具体化视图的源表的目录和架构的
USE CATALOG
和USE SCHEMA
特权。 - 对具体化视图的目标目录和架构的
USE CATALOG
和USE SCHEMA
权限。 - 对包含具体化视图的架构的
CREATE TABLE
和CREATE MATERIALIZED VIEW
权限。
- 对具体化视图引用的基表的
若要刷新物化视图,必须具有该视图的
REFRESH
权限。
- 工作区必须位于支持无服务器 SQL 仓库的区域。
查询具体化视图的要求:
必须是具体化视图的所有者,或者具有对具体化视图的
SELECT
权限,以及对其父级的USE SCHEMA
和USE CATALOG
权限。必须使用以下计算资源之一:
SQL 仓库
Lakeflow 声明式管道接口
标准访问模式计算(以前共享访问模式)
Databricks Runtime 15.4 及更高版本的专用访问模式(前单用户访问模式)(只要为无服务器计算启用了工作区,就必须如此)。 请参阅 专用计算上的精细访问控制。
如果你是具体化视图所有者,则可以使用运行 14.3 及更高版本的 Databricks Runtime 的专用访问模式计算资源。
若要了解使用具体化视图的其他限制,请参阅限制。
创建具体化视图
Databricks SQL 具体化视图 CREATE
操作使用 Databricks SQL 仓库在具体化视图中创建和加载数据。 创建具体化视图是一项同步操作,这意味着 CREATE MATERIALIZED VIEW
命令会阻止,直到创建具体化视图并完成初始数据加载。 会自动为每个 Databricks SQL 具体化视图创建无服务器管道。 当具体化视图刷新时,Lakeflow 声明性管道会处理该刷新。
若要创建具体化视图,请使用 CREATE MATERIALIZED VIEW
语句。 若要提交创建语句,请使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 编辑器。
创建具体化视图的用户是具体化视图所有者。
以下示例从基表 mv1
创建具体化视图 base_table1
:
-- This query defines the materialized view:
CREATE OR REPLACE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
使用 CREATE OR REPLACE MATERIALIZED VIEW
语句创建具体化视图时,初始数据刷新和填充将立即开始。 这不使用 SQL 仓库计算。 相反,无服务器的 Lakeflow 声明性管道用于创建和后续刷新。
基表上的列注释只会在创建时自动传播到新的具体化视图。 若要添加计划、表约束或其他属性,请修改具体化视图定义(SQL 查询)。
如果后续调用或按计划调用同一 SQL 语句,它将刷新具体化视图。 以这种方式完成的刷新将像任何其他刷新一样进行。 有关详细信息,请参阅刷新具体化视图。
若要详细了解如何配置具体化视图,请参阅 Databricks SQL 中的配置具体化视图。 若要了解创建具体化视图的完整语法,请参阅 CREATE MATERIALIZED VIEW。 若要了解如何以不同格式和不同位置加载数据,请参阅 使用 Lakeflow 声明性管道加载数据。
从外部系统加载数据
对于受支持的数据源,Databricks 建议使用 Lakehouse 联邦来加载外部数据。 关于从 Lakehouse Federation 不支持的源中加载数据的信息,请参阅数据格式选项。 有关加载数据的常规信息,包括示例,请参阅 使用 Lakeflow 声明性管道加载数据。
隐藏敏感数据
重要
此功能目前以公共预览版提供。
可以使用物化视图来隐藏表中的敏感数据,使其不被用户访问。 执行此作的一种方法是创建查询,以便它不首先包含该数据。 但是,还可以根据查询用户的权限屏蔽列或筛选行。 例如,可以为不在组中tax_id
的用户隐藏HumanResourcesDept
该列。 为此,在创建具体化视图期间使用 ROW FILTER
和 MASK
语法。 有关详细信息,请参阅使用行筛选器和列掩码筛选敏感表数据。
刷新具体化视图
刷新具体化视图会更新视图,以反映刷新时基表的最新更改。
定义具体化视图时,CREATE OR REPLACE MATERIALIZED VIEW
语句既用于创建视图,也用于在任何计划的刷新时进行刷新。 还可以使用 REFRESH MATERIALIZED VIEW
语句刷新具体化视图,而无需再次提供查询。 有关此命令的 SQL 语法和参数的详细信息,请参阅 REFRESH(MATERIALIZED VIEW 或 STREAMING TABLE)。 若要详细了解可增量刷新的具体化视图的类型,请参阅 具体化视图的增量刷新。
若要提交刷新语句,请使用 Azure Databricks UI 中的 SQL 编辑器、附加到 SQL 仓库的笔记本、Databricks SQL CLI 或 Databricks SQL API。
所有者以及任何被授予表的 REFRESH
权限的用户都可以刷新具体化视图。
以下示例刷新了 mv1
具体化视图:
REFRESH MATERIALIZED VIEW mv1;
该操作默认情况下同步,这意味着该命令会阻止,直到刷新操作完成。 若要 异步刷新,可以添加 ASYNC
关键字:
REFRESH MATERIALIZED VIEW mv1 ASYNC;
如何刷新 Databricks SQL 具体化视图?
具体化视图会自动创建和使用无服务器的 Lakeflow 声明式管道来处理刷新操作。 刷新由管道管理,更新由用于创建具体化视图的 Databricks SQL 仓库监视。 具体化视图可以通过按计划运行的流程进行更新。 Databricks SQL 创建的具体化视图始终以触发模式运行。 请参阅触发与连续管道模式。
具体化视图使用两种方法之一进行刷新。
- 增量刷新 - 系统会评估视图的查询,以识别上次更新后发生的更改,并仅合并新的或修改的数据。
- 完全刷新 - 如果无法执行增量刷新,系统将运行整个查询,并将具体化视图中的现有数据替换为新的结果。
查询的结构和源数据类型决定了是否支持增量刷新。 为了支持增量刷新,源数据应存储在 Delta 表中,并启用行跟踪和更改数据馈送。 创建具体化视图后,可以监视其刷新行为,以验证它是增量更新还是通过完全刷新进行更新。
有关刷新类型以及如何针对增量刷新进行优化的详细信息,请参阅 具体化视图的增量刷新。
异步刷新
默认情况下,刷新操作是同步执行的。 还可以将刷新操作设置为以异步方式发生。 可以使用带有关键字的 refresh 命令 ASYNC
来设置此设置。 请参阅 REFRESH(MATERIALIZED VIEW 或 STREAMING TABLE) 与每个方法关联的行为如下所示:
- 同步:同步刷新可防止其他操作继续执行,直到刷新完成。 如果结果是下一步所需的,例如在使用 Lakeflow 作业这类业务编排工具对刷新操作进行排序时,请使用同步刷新。 要通过作业协调具体化视图,请使用 SQL 任务类型。 请参阅 Lakeflow Jobs。
- 异步:异步刷新会在具体化视图刷新开始时在 Lakeflow 声明性管道上启动后台作业,从而允许命令在数据加载完成之前返回。 此刷新类型可以节省成本,因为该作不一定在启动命令的仓库中保存计算容量。 如果刷新变为空闲状态且没有其他任务正在运行,则当刷新使用其他可用计算时,仓库可以关闭。 此外,异步刷新还支持并行启动多个操作。
计划具体化视图刷新
可以将 Databricks SQL 具体化视图配置为根据定义的计划自动刷新。 若要设置计划,请执行以下操作之一:
- 创建
SCHEDULE
时,使用 子句配置计划 - 使用 ALTER MATERIALIZED VIEW 语句添加计划。
注释
或者,你可以在包含 CREATE OR REPLACE MATERIALIZED VIEW
或 REFRESH
语句的作业中创建一个任务,并像对待其他作业一样对其进行协调。 请参阅 Lakeflow Jobs。
以下示例从基表mv1
创建具体化视图base_table1
,以及一个计划,用于每小时刷新具体化视图一次:
CREATE OR REPLACE MATERIALIZED VIEW mv1
SCHEDULE EVERY 1 hour
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
若要在创建后设置或更改计划,请使用 ALTER MATERIALIZED VIEW
语句:
ALTER MATERIALIZED VIEW sales ALTER SCHEDULE EVERY 1 day;
创建计划后,会自动将新的 Databricks 作业配置为处理更新。
若要查看计划,请执行以下操作之一:
- 在 Azure Databricks UI 中从 SQL 编辑器运行
DESCRIBE EXTENDED
语句。 请参阅 DESCRIBE TABLE。 - 使用目录资源管理器查看具体化视图。 计划列在“概述”选项卡上的“刷新状态”下。 请参阅什么是目录资源管理器?。
当有刷新计划时,如果需要更新的数据,你仍可以选择随时运行手动刷新。
停止活动刷新
若要在 Lakeflow 声明性管道 UI 中停止活动刷新,请在 “管道详细信息 ”页中单击“ 停止 ”以停止管道更新。 还可以使用 Databricks CLI 或 Pipelines API 中的 POST /api/2.0/pipelines/{pipeline_id}/stop 操作停止刷新。
从启用了删除矢量的具体化视图中永久删除记录
重要
对带有具体化视图的 REORG
语句的支持处于公共预览状态。
注释
- 将
REORG
语句用于具体化视图需要 Databricks Runtime 15.4 及更高版本。 - 尽管可以使用
REORG
语句与任何物化视图一起使用,但仅在启用删除向量的物化视图中删除记录时才需要该语句。 在未启用删除向量的情况下与具体化视图一起使用时,该命令不起作用。
要通过启用删除向量功能删除物化视图中的记录,以符合 GDPR 合规性,需要额外步骤来确保 VACUUM 操作在物化视图的数据上执行。
若要以物理方式删除记录,
- 针对具体化视图运行
REORG
语句,并指定APPLY (PURGE)
参数。 例如,REORG TABLE <materialized-view-name> APPLY (PURGE);
。 请参阅 REORG TABLE。 - 等待具体化视图的数据保留期结束。 默认数据保留期为 7 天,但可以使用表属性进行配置
delta.deletedFileRetentionDuration
。 请参阅为“按时间顺序查看”查询配置数据保留。 -
REFRESH
具体化视图。 请参阅刷新具体化视图。 在REFRESH
操作后的24小时内,Lakeflow 声明式管道的维护任务,包括确保记录被永久删除的VACUUM
操作,都会自动运行。
删除具体化视图
注释
若要提交命令以删除具体化视图,您必须是该具体化视图的所有者,或者对具体化视图具有 MANAGE
特权。
若要删除具体化视图,请使用 DROP VIEW DROP VIEW 语句。 若要提交 DROP
语句,请使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 编辑器。 以下示例删除 mv1
具体化视图:
DROP MATERIALIZED VIEW mv1;
你还可以使用目录资源管理器来删除具体化视图。
- 点击边栏中的
目录。
- 在左侧的目录资源管理器树中,打开目录并选择具体化视图所在的架构。
- 打开所选架构下的 “表 ”项,然后单击具体化视图。
- 在
,选择“删除”。
了解具体化视图的成本
由于物化视图在无服务器计算环境中运行,因此超出了你为笔记本或任务设置的计算资源范围,你可能想知道如何理解与其相关的成本。 具体化视图使用量是按照 DBU 消耗量跟踪的。 若要了解详细信息,请参阅 具体化视图或流式处理表的 DBU 消耗量是多少?
启用行跟踪
为了支持来自Delta表的增量刷新,必须为这些源表启用行跟踪。 如果重新创建源表,则必须重新启用行跟踪。
以下示例演示如何对表启用行跟踪:
ALTER TABLE source_table SET TBLPROPERTIES (delta.enableRowTracking = true);
有关详细信息,请参阅 对 Delta 表使用行跟踪
限制
- 有关计算和工作区要求,请参阅要求。
- 有关增量刷新要求,请参阅 具体化视图的增量刷新。
- 具体化视图不支持标识列或代理项键。
- 如果具体化视图对可为
NULL
的列使用求和聚合,并且只有NULL
值保留在该列中,则具体化视图生成的聚合值将为零,而不是NULL
。 - 无法从具体化视图读取变更数据捕获。
- 具体化视图不支持不可能时间旅行查询。
- 支持具体化视图的基础文件可能包含来自上游表的数据(包括可能的个人身份信息),这些数据未出现在具体化视图定义中。 此数据会自动添加到基础存储,从而支持具体化视图的增量刷新。 由于具体化视图的基础文件可能会暴露来自不属于具体化视图架构的上游表的数据,因此 Databricks 建议不要与不受信任的下游使用者共享基础存储。 例如,假设一个物化视图的定义中包含
COUNT(DISTINCT field_a)
子句。 即使具体化视图定义仅包含聚合COUNT DISTINCT
子句,基础文件也会包含field_a
的实际值列表。 - 即使在专用计算上使用这些功能,也可能会产生一些无服务器计算费用。
- 如果你需要为物化视图使用 Azure 专用链接,请联系你的 Databricks 代表。