在 Databricks SQL 中使用具体化视图
注意
如果你需要为具体化视图使用 Azure 专用链接连接,请联系你的 Databricks 代表。
本文介绍如何在 Databricks SQL 中创建和使用具体化视图,以提高性能并降低数据处理和分析工作负载的成本。
什么是具体化视图?
在 Databricks SQL 中,具体化视图是 Unity Catalog 托管表,允许用户根据源表中数据的最新版本预先计算结果。 Azure Databricks 上的具体化视图不同于其他实现,因为返回的结果反映了上次刷新具体化视图时的数据状态,而不是在查询具体化视图时始终更新结果。 可以手动刷新具体化视图或计划刷新。
具体化视图非常适用于数据处理工作负载,例如提取、转换和加载 (ETL) 处理。 具体化视图提供了一种简单的声明性方法,用于处理数据以符合性、更正、聚合或常规更改数据捕获 (CDC)。 具体化视图通过预先计算慢速查询和常用计算来降低成本并改善查询延迟。 具体化视图还通过清理、扩充和反规范化基表来实现易于使用的转换。 具体化视图可以降低成本,同时提供简化的最终用户体验,因为在某些情况下,它们可以从基表增量计算更改。
随着增量实时表的推出,Azure Databricks 首次支持具体化视图。 在 Databricks SQL 仓库中创建具体化视图时,会创建无 服务器管道 来处理具体化视图的刷新。 可以在 Delta Live Tables UI 或管道 API 中监视刷新操作的状态。 请参阅查看具体化视图刷新的状态。
要求
创建或刷新具体化视图:
必须使用已启用 Unity Catalog 的专业或无服务器 SQL 仓库。
若要刷新具体化视图,必须在创建具体化视图的工作区中。
工作区必须位于支持无服务器 SQL 仓库的区域。
查询具体化视图:
- 必须是具体化视图的所有者,或者具有对具体化视图的
SELECT
权限,以及对其父级的USE SCHEMA
和USE CATALOG
权限。 - 必须使用以下计算资源之一:
- SQL 仓库
- 增量实时表接口
- 共享访问模式计算
- 只要为无服务器计算启用了工作区,Databricks Runtime 15.4 及更高版本的单用户访问模式。 请参阅单用户计算上的精细访问控制。
- 仅当是具体化视图所有者:在 14.3 和 15.3 之间运行 Databricks Runtime 的单个用户访问模式计算资源。
若要了解使用具体化视图的其他限制,请参阅限制。
创建具体化视图
Databricks SQL 具体化视图 CREATE
操作使用 Databricks SQL 仓库在具体化视图中创建和加载数据。 创建具体化视图是一项同步操作,这意味着 CREATE MATERIALIZED VIEW
命令会阻止,直到创建具体化视图并完成初始数据加载。 为每个 Databricks SQL 具体化视图自动创建无服务器增量实时表管道。 当刷新具体化视图时,增量实时表管道会处理刷新。
若要创建具体化视图,请使用 CREATE MATERIALIZED VIEW
语句。 若要提交创建语句,请使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 编辑器。
可以选择运行时通道,其中 create 语句使用TBLPROPERTIES
设置为或"CURRENT"
设置"PREVIEW"
的值的子句运行。 默认值为 "CURRENT"
。 有关增量实时表通道的详细信息,请参阅增量实时表运行时通道。 有关语法和参数的详细信息,请参阅 CREATE MATERIALIZED VIEW。
注意
创建具体化视图的用户是其所有者,需要具有以下权限:
- 对具体化视图引用的基表的
SELECT
特权。 - 对包含具体化视图的源表的目录和架构的
USE CATALOG
和USE SCHEMA
特权。 - 对具体化视图的目标目录和架构的
USE CATALOG
和USE SCHEMA
权限。 - 对包含具体化视图的架构的
CREATE TABLE
和CREATE MATERIALIZED VIEW
权限。
以下示例从基表 mv1
创建具体化视图 base_table1
:
CREATE MATERIALIZED VIEW mv1
AS SELECT
date, sum(sales) AS sum_of_sales
FROM
base_table1
GROUP BY
date;
从外部系统加载数据
对于受支持的数据源,Databricks 建议使用 Lakehouse 联合身份验证加载外部数据。 有关从 Lakehouse Federation 不支持的源加载数据的信息,请参阅数据格式选项。
刷新具体化视图
该 REFRESH
操作刷新具体化视图以反映基表的最新更改。 该操作默认情况下同步,这意味着该命令会阻止,直到刷新操作完成。 若要刷新具体化视图,请使用 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;
如何刷新 Databricks SQL 具体化视图?
具体化视图会自动创建并使用无服务器增量实时表管道来处理刷新操作。 刷新由增量实时表管道管理,更新由用于创建具体化视图的 Databricks SQL 仓库监视。 可以使用按计划运行的增量实时表管道更新具体化视图。 请参阅 “已触发”和“连续管道”模式。
注意
增量实时表运行时无法检测非增量数据源中的更改。 该表仍会定期更新,但默认触发间隔较长,以防止过度重新计算减慢计算上发生的任何增量处理。
默认情况下,刷新操作是同步执行的。 还可以将刷新操作设置为以异步方式发生。 这可以使用刷新命令进行设置。 请参阅 REFRESH (具体化视图或流式处理表) 与每个方法关联的行为如下所示:
- 同步:同步刷新可防止其他操作继续执行,直到刷新完成。 如果下一步需要结果(例如,在 Databricks 作业等业务流程工具中对刷新操作进行排序时),请使用同步刷新。 若要通过作业协调具体化视图,请使用 SQL 任务类型。 请参阅计划和协调工作流。
- 异步:在具体化视图刷新开始时,异步刷新会在增量实时表计算上启动后台作业,从而允许命令在数据加载完成之前返回。 此刷新类型可以节省成本,因为该操作不一定在启动命令的仓库中保存计算容量。 如果刷新变为空闲状态且没有其他任务正在运行,则当刷新使用其他可用计算时,仓库可以关闭。 此外,异步刷新还支持并行启动多个操作。
某些查询可以增量刷新。 请参阅 具体化视图的增量刷新。 如果无法执行增量刷新,则会改为执行完全刷新。
计划具体化视图刷新
可以将 Databricks SQL 具体化视图配置为根据定义的计划自动刷新。 若要设置计划,请执行以下操作之一:
- 创建具体化视图时,使用
SCHEDULE
子句配置计划 - 使用 ALTER MATERIALIZED VIEW 语句添加计划。
创建计划后,会自动将新的 Databricks 作业配置为处理更新。
若要查看计划,请执行以下操作之一:
- 在 Azure Databricks UI 中从 SQL 编辑器运行
DESCRIBE EXTENDED
语句。 - 使用目录资源管理器查看具体化视图。 计划列在“概述”选项卡上的“刷新状态”下。 请参阅什么是目录资源管理器?。
查看具体化视图刷新的状态
注意
由于增量实时表管道管理具体化视图刷新,因此管道的启动时间会产生延迟。 除了执行刷新所需的时间外,此时间可能以秒到分钟为单位。
可以在增量实时表 UI 中查看管理具体化视图的管道或查看 DESCRIBE EXTENDED
命令为具体化视图返回的刷新信息,以此查看具体化视图的刷新状态。
还可以通过查询 Delta Live Tables 事件日志来查看具体化视图的刷新历史记录。 请参阅查看具体化视图的刷新历史记录。
在增量实时表 UI 中查看刷新状态
默认情况下,管理具体化视图的增量实时表管道在增量实时表 UI 中不可见。 若要在增量实时表 UI 中查看管道,必须直接访问指向管道的“管道详细信息”页的链接。 访问链接:
- 复制并粘贴
DESCRIBE EXTENDED
语句返回的表的“最新刷新”行中显示的链接。 - 在具体化视图的世系选项卡上,单击“管道”,然后单击管道链接。
对于使用 Azure Databricks UI 中的 SQL 编辑器提交的异步 REFRESH
命令,可以按照“结果”面板中显示的链接查看刷新状态。
停止活动刷新
若要停止增量实时表 UI 中的活动刷新,请在“管道详细信息”页中单击“停止”以停止管道更新。 还可以使用 Databricks CLI 或 Pipelines API 中的 POST /api/2.0/pipelines/{pipeline_id}/stop 操作停止刷新。
更新具体化视图的定义
若要更新具体化视图的定义,必须先删除,然后重新创建具体化视图。
删除具体化视图
注意
若要提交命令以删除具体化视图,你必须是该具体化视图的所有者。
若要删除具体化视图,请使用 DROP VIEW 语句。 若要提交 DROP
语句,请使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 编辑器。 以下示例删除 mv1
具体化视图:
DROP MATERIALIZED VIEW mv1;
描述具体化视图
若要检索具体化视图的列和数据类型,请使用 DESCRIBE
语句。 若要检索具体化视图的列、数据类型和元数据(例如所有者、位置、创建时间和刷新状态),请使用 DESCRIBE EXTENDED
。 若要提交 DESCRIBE
语句,请使用 Azure Databricks UI、Databricks SQL CLI 或 Databricks SQL API 中的 SQL 编辑器。
更改具体化视图的所有者
如果你既是元存储管理员,又是工作区管理员,则可以更改具体化视图的所有者。具体化视图会自动创建和使用增量实时表管道来处理更改。 使用以下步骤更改具体化视图所有者:
- 在具体化视图的世系选项卡上,单击“管道”,然后单击管道链接。
- 单击管道名称右侧的 串形菜单,然后单击“权限”。 随即会打开“权限”对话框。
- 单击当前所有者名称右侧的“x”可删除当前所有者。
- 开始键入内容以筛选可用用户列表。 单击要设为新的管道所有者的用户。
- 单击“保存”以保存更改并关闭对话框。
所有管道资产(包括管道中定义的具体化视图)均由新管道所有者拥有。 将来的所有更新都将使用新所有者的身份来运行。
控制对具体化视图的访问
具体化视图支持丰富的访问控制来支持数据共享,同时避免公开潜在的私有数据。 具体化视图所有者可以向其他用户授予 SELECT
权限。 有权 SELECT
访问具体化视图的用户不需要 SELECT
访问具体化视图引用的表。 此访问控制支持数据共享,同时控制对基础数据的访问。
向具体化视图授予权限
若要授予对具体化视图的访问权限,请使用 GRANT
语句:
GRANT
privilege_type [, privilege_type ] ...
ON <mv_name> TO principal;
privilege_type 可以是:
SELECT
- 用户可以SELECT
具体化视图。REFRESH
- 用户可以REFRESH
具体化视图。 刷新是使用所有者的权限运行的。
以下示例创建了一个具体化视图,并向用户授予了选择和刷新特权:
CREATE MATERIALIZED VIEW <mv_name> AS SELECT * FROM <base_table>;
GRANT SELECT ON <mv_name> TO user;
GRANT REFRESH ON <mv_name> TO user;
从具体化视图撤消权限
若要从具体化视图撤消访问权限,请使用 REVOKE
语句:
REVOKE
privilege_type [, privilege_type ]
ON <name> FROM principal;
当从具体化视图所有者或已被授予 SELECT
具体化视图权限的任何其他用户撤消对基表的 SELECT
权限,或者删除基表时,具体化视图所有者或授予访问权限的用户仍能够查询具体化视图。 但是,会发生以下行为:
- 具体化视图所有者或已失去对具体化视图的访问权限的其他人无法再
REFRESH
该具体化视图,具体化视图将变得陈旧。 - 如果计划自动执行,则下一个计划
REFRESH
失败或未运行。
以下示例从 mv1
撤销 SELECT
权限:
REVOKE SELECT ON mv1 FROM user1;
启用更改数据馈送
具体化视图基表需要更改数据馈送,但某些高级用例除外。 如果要在基表上启用更改数据馈送,可以通过使用以下语法设置 delta.enableChangeDataFeed
表属性:
ALTER TABLE table1 SET TBLPROPERTIES (delta.enableChangeDataFeed = true);
查看具体化视图的刷新历史记录
要查看具体化视图上 REFRESH
操作的状态(包括当前和过去的刷新),请查询 Delta Live Tables 事件日志:
SELECT
*
FROM
event_log(TABLE(<fully-qualified-table-name>))
WHERE
event_type = "update_progress"
ORDER BY
timestamp desc;
将 <fully-qualified-table-name>
替换为具体化视图的完全限定名称,包括目录和架构。
请参阅什么是增量实时表事件日志?。
限制
- 有关计算和工作区要求,请参阅要求。
- 具体化视图不支持标识列或代理项键。
- 如果具体化视图对
NULL
促成的列使用求和聚合,并且只有NULL
值保留在该列中,则具体化视图生成的聚合值为零,而不是NULL
。 - 无法从具体化视图读取更改数据提要。
- 时间旅行查询不会在具体化视图上报告。
- 支持具体化视图的基础文件可能包含来自上游表的数据(包括可能的个人身份信息),这些数据未出现在具体化视图定义中。 此数据会自动添加到基础存储,从而支持具体化视图的增量刷新。 由于具体化视图的基础文件可能会暴露来自不属于具体化视图架构的上游表的数据,因此 Databricks 建议不要与不受信任的下游使用者共享基础存储。 例如,假设具体化视图的定义包含
COUNT(DISTINCT field_a)
子句。 即使具体化视图定义仅包含聚合COUNT DISTINCT
子句,基础文件也会包含field_a
的实际值列表。