具体化视图

与标准视图一样,具体化视图是查询的结果,访问它们的方式与表相同。 与对每个查询重新计算结果的标准视图不同,具体化视图缓存结果并按指定的间隔刷新结果。 由于具体化视图是预计算的,因此查询具体化视图可以比查询常规视图快得多。

具体化视图是声明性管道对象。 它包括定义它的 查询 、更新它的 以及用于快速访问的缓存结果。 具体化视图:

  • 跟踪上游数据的更改。
  • 在触发时,以增量方式处理更改的数据并应用必要的转换。
  • 根据指定的刷新间隔维护与源数据同步的输出表。

对于许多转换来说,具体化视图是一个不错的选择:

  • 对缓存的结果应用推理而不是对行。 事实上,只需编写查询即可。
  • 它们总是正确的。 即使数据延迟或无序,所有必需的数据也会被处理。
  • 它们通常是增量的。 Databricks 将尝试选择适当的策略,以最大程度地降低更新具体化视图的成本。

物化视图的工作原理

下图说明了具体化视图的工作原理。

显示具体化视图工作原理的关系图

具体化视图由单个管道定义和更新。 可以在管道的源代码中显式定义具体化视图。 管道定义的表不能由任何其他管道更改或更新。

注释

使用 Databricks SQL 在管道外部创建具体化视图时,Azure Databricks 会创建用于更新视图的管道。 可以通过从工作区左侧导航中选择Jobs & Pipelines来查看流水线。 可以将 “管道类型 ”列添加到视图中。 在 Lakeflow 声明性管道中创建的物化视图具有一种类型 ETL。 Databricks SQL 中创建的具体化视图的类型为 MV/ST.

Databricks 使用 Unity 目录存储有关视图的元数据,包括用于增量更新的查询和其他系统视图。 缓存的数据在云存储中具体化。

以下示例将两个表联接在一起,并使用具体化视图使结果保持最新。

Python

from pyspark import pipelines as dp

@dp.materialized_view
def regional_sales():
  partners_df = spark.read.table("partners")
  sales_df = spark.read.table("sales")

  return (
    partners_df.join(sales_df, on="partner_id", how="inner")
  )

SQL

CREATE OR REPLACE MATERIALIZED VIEW regional_sales
  AS SELECT *
  FROM partners
    INNER JOIN sales ON
      partners.partner_id = sales.partner_id;

自动增量更新

触发定义具体化视图的管道时,视图会自动保持最新状态,通常是增量的。 Databricks 仅尝试处理必须处理的数据,以使具体化视图保持最新状态。 具体化视图始终显示正确的结果,即使它需要从头开始完全重新计算查询结果,但通常 Databricks 只会对具体化视图进行增量更新,这比完全重新计算的成本要低得多。

下图显示了一个具体化视图sales_report,这是将两个上游表clean_customersclean_transactions连接,并按国家/地区分组的结果。 上游流程在三个国家(美国、荷兰、英国)分别将 200 行插入到 clean_customers ,并更新 clean_transactions 中与这些新客户相对应的 5,000 行。 sales_report 具体化视图仅针对具有新客户或相应交易的国家/地区进行增量更新。 在此示例中,我们看到更新了三行,而不是整个销售报表。

具体化视图增量更新示例

有关增量刷新在具体化视图中的工作原理的更多详细信息,请参阅 具体化视图的增量刷新

具体化视图的限制

具体化视图具有以下限制:

  • 由于更新创建了正确的查询,因此对输入的一些更改需要对具体化视图进行完全重新计算,这可能很昂贵。
  • 它们不用于低延迟用例。 更新具体化视图的延迟为秒或分钟,而不是毫秒。
  • 并非所有计算都可以增量计算。