CREATE MATERIALIZED VIEW (DLT)

具体化视图是预计算结果可用于查询的视图,并且可以更新以反映输入中的更改。 管道笔记本中定义的具体化视图由 DLT 管道提供支持。 每次更新具体化视图时,都会重新计算查询结果,以反映上游数据集中的变化。 可以手动或按计划更新具体化视图。

要详细了解如何执行或计划更新,请参阅在 DLT 管道上运行更新

语法

CREATE [OR REFRESH] [PRIVATE] MATERIALIZED VIEW
  view_name
  [ column_list ]
  [ view_clauses ]
  AS query

column_list
   ( { column_name column_type column_properties } [, ...]
    [ column_constraint ] [, ...]
    [ , table_constraint ] [...] )

   column_properties
      { NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
  { USING DELTA |
    PARTITIONED BY (col [, ...]) |
    CLUSTER BY clause |
    LOCATION path |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    WITH { ROW FILTER clause } } [...]

参数

  • REFRESH

    如果指定,将创建视图或更新现有视图及其内容。

  • 专用

    创建专用具体化视图。 专用具体化视图在不希望发布到目录的管道中用作中间表。

    • 它们不会添加到目录中,并且只能在定义管道中访问
    • 它们可以与目录中的现有对象同名。 在管道中,如果专用具体化视图和目录中的对象同名,则对该名称的引用将解析为专用具体化视图。
    • 专用具体化视图仅在管道的生存期内保留,而不仅仅是单个更新。

专用具体化视图以前是使用 TEMPORARY 参数创建的。

  • view_name

    新创建的视图的名称。 完全限定的视图名称必须是独一无二的。

    专用具体化视图可以与目录中发布的对象同名。

  • column_list

    (可选)在视图的查询结果中标记列。 如果提供列列表,则列别名的数量必须与查询中的表达式数量一致。 如果未指定列列表,则别名派生自视图主体。

    • column_name

      列名必须具有唯一性,并映射到查询的输出列。

    • 列类型

      指定列的数据类型。 并非 Azure Databricks 支持的所有数据类型都受具体化视图支持。

    • column_comment

      描述列的可选 STRING 文本。 此选项必须与 column_type 一起指定。 如果未指定列类型,则会跳过列注释。

    • column_constraint

      添加一个约束,用于在数据流入表时验证数据。 请参阅通过管道预期管理数据质量

    • MASK 子句

      重要

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

      添加列掩码函数以对敏感数据进行匿名化处理。 请参阅使用行筛选器和列掩码筛选敏感表数据

  • table_constraint

    重要

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

    指定架构时,可以定义主键和外键。 约束具备信息性,系统不会强制执行。 请参阅 SQL 语言参考中的 CONSTRAINT 子句

    注释

    若要定义表约束,管道必须是启用了 Unity Catalog 的管道。

  • view_clauses

    (可选)指定具体化视图的分区、注释和用户定义的属性。 每个子子句只能指定一次。

    • 使用 DELTA

      指定数据格式。 唯一的选项是 DELTA。

      此子句是可选的,默认为 DELTA。

    • PARTITIONED BY

      包含一列或多列的可选列表,用于对表进行分区。 与 CLUSTER BY 互斥。

      Liquid 聚类分析提供灵活的优化解决方案进行聚类分析。 请考虑对 DLT 使用 CLUSTER BY 而不是 PARTITIONED BY

    • CLUSTER BY

      对表启用动态聚类,并定义要用作聚类键的列。 与 PARTITIONED BY 互斥。

      请参阅使用液体聚类分析 Delta 表

    • LOCATION

      表数据的可选存储位置。 如果未设置,系统将默认为管道存储位置。

      仅当发布到 hms 时,此选项才可用。 在 uc 中,会自动管理位置。

    • 评论

      表的可选说明。

    • TBLPROPERTIES

      表的表属性可选列表。

    • ROW FILTERWITH

    重要

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

    向表中添加行筛选器函数。 将来对该表的查询会收到函数计算结果为 TRUE 的行的子集。 这对于精细的访问控制很有用,因为它允许函数检查调用用户的标识和组成员身份以决定是否筛选某些行。

    请参阅 ROW FILTER 条款

  • 查询

    定义表数据集的 DLT 查询。

所需的权限

管道的运行方式用户必须具有以下权限:

  • 对具体化视图引用的基表具有 SELECT 特权。
  • 对父目录的 USE CATALOG 特权和对父架构的 USE SCHEMA 特权。
  • 对具体化视图的架构具有 CREATE MATERIALIZED VIEW 特权。

为了使用户能够更新在其中定义具体化视图的管道,他们需要:

  • 对父目录的 USE CATALOG 特权和对父架构的 USE SCHEMA 特权。
  • 具体化视图的所有权或对具体化视图的 REFRESH 特权。
  • 具体化视图的所有者必须对具体化视图引用的基表具有 SELECT 特权。

要使用户能够查询生成的具体化视图,他们需要:

  • 对父目录的 USE CATALOG 特权和对父架构的 USE SCHEMA 特权。
  • 对具体化视图的 SELECT 特权。

局限性

  • 当在可以为 NULL 的列上具有 sum 聚合的具体化视图从该列中移除了最后一个非 NULL 值 - 因此该列中只剩下 NULL 个值时,具体化视图的结果聚合值将返回零而不是 NULL
  • 列引用不需要别名。 非列引用表达式需要别名,如以下示例所示:
    • 允许:SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • 不允许:SELECT col1, SUM(col2) FROM t GROUP BY col1
  • 必须手动指定 NOT NULLPRIMARY KEY,才能成为有效的语句。
  • 具体化视图不支持标识列或代理项键。
  • 具体化视图不支持 OPTIMIZEVACUUM 命令。 维护是自动进行的。
  • 不支持重命名表或更改所有者。
  • 不支持生成的列、标识列和默认列。

例子

-- Create a materialized view by reading from an external data source, using the default schema:
CREATE OR REFRESH MATERIALIZED VIEW taxi_raw
AS SELECT * FROM read_files("/databricks-datasets/nyctaxi/sample/json/")

-- Create a materialized view by reading from a dataset defined in a pipeline:
CREATE OR REFRESH MATERIALIZED VIEW filtered_data
AS SELECT
  ...
FROM taxi_raw

-- Specify a schema and clustering columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) CLUSTER BY (order_day_of_week, customer_id)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify partition columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) PARTITIONED BY (order_day_of_week)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a primary and foreign key constraint for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING NOT NULL PRIMARY KEY,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime)),
  CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES main.default.customers(customer_id)
)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a row filter and mask clause for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales (
  customer_id STRING MASK catalog.schema.customer_id_mask_fn,
  customer_name STRING,
  number_of_line_items STRING COMMENT 'Number of items in the order',
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
)
COMMENT "Raw data on sales"
WITH ROW FILTER catalog.schema.order_number_filter_fn ON (order_number)
AS SELECT * FROM sales_bronze