与标准视图一样,具体化视图是查询的结果,访问它们的方式与表相同。 与对每个查询重新计算结果的标准视图不同,具体化视图缓存结果并按指定的间隔刷新结果。 由于具体化视图是预计算的,因此查询具体化视图可以比查询常规视图快得多。
具体化视图是声明性管道对象。 它包括定义它的 查询 、更新它的 流 以及用于快速访问的缓存结果。 具体化视图:
- 跟踪上游数据的更改。
- 在触发时,以增量方式处理更改的数据并应用必要的转换。
- 根据指定的刷新间隔维护与源数据同步的输出表。
对于许多转换来说,具体化视图是一个不错的选择:
- 对缓存的结果应用推理而不是对行。 事实上,只需编写查询即可。
- 它们总是正确的。 即使数据延迟或无序,所有必需的数据也会被处理。
- 它们通常是增量的。 Databricks 将尝试选择适当的策略,以最大程度地降低更新具体化视图的成本。
物化视图的工作原理
下图说明了具体化视图的工作原理。
               
              
            
具体化视图由单个管道定义和更新。 可以在管道的源代码中显式定义具体化视图。 管道定义的表不能由任何其他管道更改或更新。
注释
使用 Databricks SQL 在管道外部创建具体化视图时,Azure Databricks 会创建用于更新视图的管道。 可以通过从工作区左侧导航中选择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_customers和clean_transactions连接,并按国家/地区分组的结果。 上游流程在三个国家(美国、荷兰、英国)分别将 200 行插入到 clean_customers ,并更新 clean_transactions 中与这些新客户相对应的 5,000 行。 
              sales_report 具体化视图仅针对具有新客户或相应交易的国家/地区进行增量更新。 在此示例中,我们看到更新了三行,而不是整个销售报表。
               
              
            
有关增量刷新在具体化视图中的工作原理的更多详细信息,请参阅 具体化视图的增量刷新。
具体化视图的限制
具体化视图具有以下限制:
- 由于更新创建了正确的查询,因此对输入的一些更改需要对具体化视图进行完全重新计算,这可能很昂贵。
- 它们不用于低延迟用例。 更新具体化视图的延迟为秒或分钟,而不是毫秒。
- 并非所有计算都可以增量计算。