在 Databricks SQL 中使用具体化视图

重要

此功能目前以公共预览版提供。

本文介绍如何在 Databricks SQL 中创建和使用具体化视图,以提高性能并降低数据处理和分析工作负载的成本。

什么是具体化视图?

在 Databricks SQL 中,具体化视图是 Unity Catalog 托管表,允许用户根据源表中数据的最新版本预先计算结果。 Azure Databricks 上的具体化视图不同于其他实现,因为返回的结果反映了上次刷新具体化视图时的数据状态,而不是在查询具体化视图时始终更新结果。 可以手动刷新具体化视图或计划刷新。

具体化视图非常适用于数据处理工作负载,例如提取、转换和加载 (ETL) 处理。 具体化视图提供了一种简单的声明性方法,用于处理数据以符合性、更正、聚合或常规更改数据捕获 (CDC)。 具体化视图通过预先计算慢速查询和常用计算来降低成本并改善查询延迟。 具体化视图还通过清理、扩充和反规范化基表来实现易于使用的转换。 具体化视图可以降低成本,同时提供简化的最终用户体验,因为在某些情况下,它们可以从基表增量计算更改。

随着 Delta Live Tables 的推出,Databricks Data Intelligence 平台最先支持具体化视图。 在 Databricks SQL 仓库中创建具体化视图时,将创建增量实时表管道来处理具体化视图的刷新。 可以在增量实时表 UI、增量实时表 API 或增量实时表 CLI 中监视刷新操作的状态。 请参阅查看具体化视图刷新的状态

要求

  • 必须使用已启用 Unity Catalog 的 Databricks SQL 仓库来创建和刷新具体化视图。

  • 工作区必须位于支持无服务器 SQL 仓库的区域。

若要了解在 Databricks SQL 中使用具体化视图时的限制,请参阅限制

创建具体化视图

若要创建具体化视图,请使用 CREATE MATERIALIZED VIEW 语句。 请参阅 Databricks SQL 参考中的创建具体化视图。 若要提交创建语句,请使用 Azure Databricks UI、Databricks SQL CLIDatabricks SQL API 中的 SQL 编辑器

注意

创建具体化视图的用户是其所有者,需要具有以下权限:

  • 对具体化视图引用的基表的 SELECT 特权。
  • 对包含具体化视图的源表的目录和架构的 USE CATALOGUSE SCHEMA 特权。
  • 对具体化视图的目标目录和架构的 USE CATALOGUSE SCHEMA 权限。
  • 对包含具体化视图的架构的 CREATE TABLECREATE MATERIALIZED VIEW 权限。

以下示例从基表 mv1 创建具体化视图 base_table1

CREATE MATERIALIZED VIEW mv1
AS SELECT
  date, sum(sales) AS sum_of_sales
FROM
  table1
GROUP BY
  date;

如何创建具体化视图?

Databricks SQL 具体化视图 CREATE 操作使用 Databricks SQL 仓库在具体化视图中创建和加载数据。 由于创建具体化视图是 Databricks SQL 仓库中的同步操作,因此 CREATE MATERIALIZED VIEW 命令会阻止,直到创建具体化视图并完成初始数据加载。 为每个 Databricks SQL 具体化视图自动创建增量实时表管道。 刷新具体化视图时,将启动对增量实时表管道的更新以处理刷新。

从外部系统加载数据

对于受支持的数据源,Databricks 建议使用 Lakehouse 联合身份验证加载外部数据。 有关从 Lakehouse Federation 不支持的源加载数据的信息,请参阅数据格式选项

刷新具体化视图

REFRESH 操作刷新具体化视图以反映基表的最新更改。 若要刷新具体化视图,请使用 REFRESH MATERIALIZED VIEW 语句。 请参阅 Databricks SQL 参考中的刷新(具体化视图和流式处理表)。 若要提交刷新语句,请使用 Azure Databricks UI、Databricks SQL CLIDatabricks SQL API 中的 SQL 编辑器

只有所有者才能 REFRESH 具体化视图。

以下示例刷新 mv1 具体化视图:

REFRESH MATERIALIZED VIEW mv1;

如何刷新 Databricks SQL 具体化视图?

具体化视图会自动创建并使用增量实时表管道来处理刷新操作。 由于刷新由增量实时表管道管理,因此不使用用于创建具体化视图的 Databricks SQL 仓库,并且不需要在刷新操作期间运行。

增量实时表管道使用连续执行模式或触发执行模式。 具体化视图可以在任一执行模式下更新。 为了避免在连续执行模式下操作时进行不必要的处理,管道会自动监视依赖增量表,并仅在这些依赖表的内容发生更改时才执行更新。 请参阅什么是增量实时表管道?

注意

增量实时表运行时无法检测非增量数据源中的更改。 该表仍会定期更新,但默认触发间隔较长,以防止过度重新计算减慢计算上发生的任何增量处理。

默认情况下,刷新操作是同步执行的。 还可以将刷新操作设置为以异步方式发生。 与每种方法相关联的行为如下所示:

  • 同步:同步刷新会阻止其他操作,直到刷新操作完成。 这样可以在业务流程工具(如工作流)中对刷新操作进行排序。 若要使用工作流协调具体化视图,请使用“SQL”任务类型。 请参阅 Azure Databricks 工作流简介
  • 异步:当具体化视图刷新开始时,异步刷新会在增量实时表计算上启动后台作业,并且该命令会在数据加载完成之前返回。 由于增量实时表管道管理刷新,因此不使用用于创建具体化视图的 Databricks SQL 仓库。 它不需要在刷新操作期间运行。

某些查询可以增量刷新。 请参阅刷新具体化视图的操作。 如果无法执行增量刷新,则会改为执行完全刷新。

计划具体化视图刷新

可以将 Databricks SQL 具体化视图配置为根据定义的计划自动刷新。 创建具体化视图或使用 ALTER VIEW 语句添加计划时,请使用 SCHEDULE 子句配置此计划。 创建计划后,会自动将新的 Databricks 作业配置为处理更新。 可以使用 DESCRIBE EXTENDED 语句随时查看计划。

更新具体化视图的定义

若要更新具体化视图的定义,必须先删除,然后重新创建具体化视图。

删除具体化视图

注意

若要提交命令以删除具体化视图,你必须是该具体化视图的所有者。

若要删除具体化视图,请使用 DROP VIEW 语句。 若要提交 DROP 语句,请使用 Azure Databricks UI、Databricks SQL CLIDatabricks SQL API 中的 SQL 编辑器。 以下示例删除 mv1 具体化视图:

DROP MATERIALIZED VIEW mv1;

描述具体化视图

若要检索具体化视图的列和数据类型,请使用 DESCRIBE 语句。 若要检索具体化视图的列、数据类型和元数据(例如所有者、位置、创建时间和刷新状态),请使用 DESCRIBE EXTENDED。 若要提交 DESCRIBE 语句,请使用 Azure Databricks UI、Databricks SQL CLI, or the Databricks SQL API 中的 SQL 编辑器

查看具体化视图刷新的状态

注意

由于增量实时表管道管理具体化视图刷新,因此管道的启动时间会产生延迟。 除了执行刷新所需的时间外,此时间可能以秒到分钟为单位。

可以在增量实时表 UI 中查看管理具体化视图的管道或查看 DESCRIBE EXTENDED 命令为具体化视图返回的刷新信息,以此查看具体化视图的刷新状态。

还可以通过查询 Delta Live Tables 事件日志来查看具体化视图的刷新历史记录。 请参阅查看具体化视图的刷新历史记录

在增量实时表 UI 中查看刷新状态

默认情况下,管理具体化视图的增量实时表管道在增量实时表 UI 中不可见。 若要在增量实时表 UI 中查看管道,必须直接访问指向管道的“管道详细信息”页的链接。 访问链接:

  • 如果在 SQL 编辑器中提交 REFRESH 命令,请按照“结果”面板中的链接操作。
  • 遵循 DESCRIBE EXTENDED 语句返回的链接。
  • 在具体化视图的世系选项卡上,单击“管道”,然后单击管道链接。

停止活动刷新

若要停止增量实时表 UI 中的活动刷新,请在“管道详细信息”页中单击“停止”以停止管道更新。 还可以使用 Databricks CLI 或 Pipelines API 中的 POST /api/2.0/pipelines/{pipeline_id}/stop 操作停止刷新。

更改具体化视图的所有者

如果你既是元存储管理员,又是工作区管理员,则可以更改具体化视图的所有者。具体化视图会自动创建并使用增量实时表管道来处理更改。 使用以下步骤更改具体化视图所有者:

  • 单击 作业图标工作流”,然后单击“增量实时表”选项卡。
  • 单击要更改其所有者的管道的名称。
  • 单击管道名称右侧的 Kebab 菜单 串形菜单,然后单击“权限”。 随即会打开“权限”对话框。
  • 单击当前所有者名称右侧的“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> 替换为具体化视图的完全限定名称,包括目录和架构。

请参阅什么是增量实时表事件日志?

确定是使用增量刷新还是完全刷新

为了优化具体化视图刷新的性能,Azure Databricks 使用成本模型来选择用于刷新的技术。 下表介绍了这些技术:

方法 增量刷新? 说明
FULL_RECOMPUTE 已完全重新计算具体化视图
NO_OP 不适用 未更新具体化视图,因为未检测到基表的更改。
ROW_BASEDPARTITION_OVERWRITE 具体化视图已使用指定技术以增量方式刷新。

要确定使用的技术,请查询 Delta Live Tables 事件日志,其中 event_typeplanning_information

SELECT
  timestamp,
  message
FROM
  event_log(TABLE(<fully-qualified-table-name>))
WHERE
  event_type = 'planning_information'
ORDER BY
  timestamp desc;

<fully-qualified-table-name> 替换为具体化视图的完全限定名称,包括目录和架构。

请参阅什么是增量实时表事件日志?

限制

  • 管理具体化视图的方式和查询位置存在限制:
    • 只能在 pro SQL 仓库和无服务器 SQL 仓库中创建和刷新 Databricks SQL 具体化视图。
    • Databricks SQL 具体化视图只能从创建它的工作区中刷新。
    • Databricks SQL 具体化视图的所有者可以从单用户访问模式群集查询具体化视图。 否则只能从 Databricks SQL 仓库、Delta Live Tables 和运行 Databricks Runtime 11.3 或更高版本的共享群集中查询 Databricks SQL 具体化视图。
  • 具体化视图不支持标识列或代理项键。
  • 如果具体化视图对 NULL促成的列使用求和聚合,并且只有 NULL 值保留在该列中,则具体化视图生成的聚合值为零,而不是 NULL
  • 无法从具体化视图读取更改数据提要
  • 支持具体化视图的基础文件可能包含来自上游表的数据(包括可能的个人身份信息),这些数据未出现在具体化视图定义中。 此数据会自动添加到基础存储,从而支持具体化视图的增量刷新。 由于具体化视图的基础文件可能会暴露来自不属于具体化视图架构的上游表的数据,因此 Databricks 建议不要与不受信任的下游使用者共享基础存储。 例如,假设具体化视图的定义包含COUNT(DISTINCT field_a)子句。 即使具体化视图定义仅包含聚合COUNT DISTINCT子句,基础文件也会包含field_a的实际值列表。