在 Databricks SQL 中使用具体化视图

.. aws:

   - If you need to use an AWS PrivateLink connection with your <mv>, contact your Databricks representative.

.. azure::

   - If you need to use an Azure Private Link connection with your <mv>, contact your Databricks representative.

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

什么是具体化视图?

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

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

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

要求

创建或刷新具体化视图:

  • 必须使用已启用 Unity Catalog 的专业或无服务器 SQL 仓库。

    若要刷新具体化视图,必须在创建具体化视图的工作区中。

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

查询具体化视图:

  • 必须是具体化视图的所有者,或者具有对具体化视图的 SELECT 权限,以及对其父级的 USE SCHEMAUSE CATALOG 权限。
  • 必须使用以下计算资源之一:
    • SQL 仓库
    • 增量实时表接口
    • 共享访问模式计算
    • Databricks Runtime 15.4 及更高版本的单用户访问模式,只要为无服务器计算启用了工作区即可。 请参阅单用户计算上的精细访问控制
    • 仅当是具体化视图所有者时:运行 Databricks Runtime 15.3 及更低版本的单用户访问模式计算资源。

若要了解使用具体化视图的其他限制,请参阅限制

创建具体化视图

Databricks SQL 具体化视图 CREATE 操作使用 Databricks SQL 仓库在具体化视图中创建和加载数据。 创建具体化视图是一项同步操作,这意味着 CREATE MATERIALIZED VIEW 命令会阻止,直到创建具体化视图并完成初始数据加载。 为每个 Databricks SQL 具体化视图自动创建无服务器增量实时表管道。 当刷新具体化视图时,增量实时表管道会处理刷新。

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

有关语法和参数的详细信息,请参阅 CREATE MATERIALIZED VIEW

注意

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

  • 对具体化视图引用的基表的 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 建议使用 Lakehouse 联合身份验证加载外部数据。 有关从 Lakehouse Federation 不支持的源加载数据的信息,请参阅数据格式选项

刷新具体化视图

REFRESH 操作刷新具体化视图以反映基表的最新更改。 该操作默认情况下同步,这意味着该命令会阻止,直到刷新操作完成。 若要刷新具体化视图,请使用 REFRESH MATERIALIZED VIEW 语句。 有关此命令的 SQL 语法和参数的详细信息,请参阅 REFRESH (MATERIALIZED VIEW 或 STREAMING TABLE。 若要详细了解可增量刷新的具体化视图的类型,请参阅具体化视图的刷新操作

若要提交刷新语句,请使用 Azure Databricks UI 中的 SQL 编辑器、附加到 SQL 仓库的笔记本、Databricks SQL CLIDatabricks SQL API

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

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

REFRESH MATERIALIZED VIEW mv1;

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

具体化视图会自动创建并使用无服务器增量实时表管道来处理刷新操作。 刷新由增量实时表管道管理,更新由用于创建具体化视图的 Databricks SQL 仓库监视。

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

注意

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

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

  • 同步:同步刷新会阻止其他操作,直到刷新操作完成。 这样可以在业务流程工具(如作业)中对刷新操作进行排序。 若要使用作业协调具体化视图,请使用“SQL”任务类型。 请参阅计划和协调工作流
  • 异步:当具体化视图刷新开始时,异步刷新会在增量实时表计算上启动后台作业,并且该命令会在数据加载完成之前返回。

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

计划具体化视图刷新

可以将 Databricks SQL 具体化视图配置为根据定义的计划自动刷新。 若要设置计划,请执行以下操作之一:

创建计划后,会自动将新的 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 CLIDatabricks SQL API 中的 SQL 编辑器。 以下示例删除 mv1 具体化视图:

DROP MATERIALIZED VIEW mv1;

描述具体化视图

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

更改具体化视图的所有者

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

  • 在具体化视图的世系选项卡上,单击“管道”,然后单击管道链接。
  • 单击管道名称右侧的 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> 替换为具体化视图的完全限定名称,包括目录和架构。

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

限制

  • 有关计算和工作区要求,请参阅要求
  • 具体化视图不支持标识列或代理项键。
  • 如果具体化视图对 NULL促成的列使用求和聚合,并且只有 NULL 值保留在该列中,则具体化视图生成的聚合值为零,而不是 NULL
  • 无法从具体化视图读取更改数据提要
  • 支持具体化视图的基础文件可能包含来自上游表的数据(包括可能的个人身份信息),这些数据未出现在具体化视图定义中。 此数据会自动添加到基础存储,从而支持具体化视图的增量刷新。 由于具体化视图的基础文件可能会暴露来自不属于具体化视图架构的上游表的数据,因此 Databricks 建议不要与不受信任的下游使用者共享基础存储。 例如,假设具体化视图的定义包含COUNT(DISTINCT field_a)子句。 即使具体化视图定义仅包含聚合COUNT DISTINCT子句,基础文件也会包含field_a的实际值列表。