Databricks 建议使用 Unity 目录配置 DLT 管道。
配置了 Unity Catalog 的管道将所有定义的物化视图和流式表发布到指定的目录和架构。 Unity Catalog 管道可以从其他 Unity Catalog 表和卷进行读取。
若要管理对 Unity Catalog 管道所创建的表的权限,请使用 GRANT 和 REVOKE。
备注
本文讨论管道当前默认发布模式的功能。 在 2025 年 2 月 5 日之前创建的管道可能使用旧版发布模式和 LIVE
虚拟架构。 请参阅 LIVE 架构(旧版)。
若要在 Unity 目录中的目标架构中创建流式处理表和具体化视图,必须对架构和父目录拥有以下权限:
对目标目录的
USE CATALOG
特权。如果管道创建具体化视图,则需要在目标架构上具有
CREATE MATERIALIZED VIEW
和USE SCHEMA
特权。CREATE TABLE
如果管道创建,则对目标架构具有USE SCHEMA
特权。
如果管道创建新的架构,则必须对目标目录拥有 USE CATALOG
和 CREATE SCHEMA
权限。
运行已启用 Unity Catalog 的管道所需的计算:
- 标准访问模式(以前共享访问模式)。 启用了 Unity 目录的管道无法在专用计算(以前是单个用户计算)上运行。 请参阅 Unity 目录的标准访问模式限制。
使用 Unity Catalog 查询 DLT 管道创建的表(包括流式表和物化视图)所需的计算包括以下任一项:
SQL 仓库
Databricks Runtime 13.3 LTS 或更高版本上的标准访问模式计算。
专用访问模式计算(如果在专用计算上启用了精细访问控制(即,它在 Databricks Runtime 15.4 或更高版本上运行,并且为工作区启用了无服务器计算)。
只有在表所有者运行查询时,才使用 13.3 LTS 至 15.3 的专用访问模式计算。
附加的计算资源限制适用。 请参阅下一节。
将 Unity 目录与 DLT 配合使用时,存在以下限制:
默认情况下,只有管道所有者和工作区管理员可以从运行启用了 Unity 目录的管道的计算中查看驱动程序日志。 若要允许其他用户访问驱动程序日志,请参阅允许非管理员用户从启用了 Unity 目录的管道查看驱动程序日志。
使用 Hive 元数据存储的现有管道无法升级为使用 Unity Catalog。 若要迁移写入到 Hive 元存储的现有管道,必须创建新管道,并从数据源重新引入数据。 请参阅通过克隆 Hive 元存储管道创建 Unity Catalog 管道。
不能在附加到元存储(已在 Unity Catalog 公开预览期间创建)的工作区中创建已启用 Unity Catalog 的管道。 请参阅 “升级到特权继承”。
不支持 JAR。 仅支持第三方 Python 库。 请参阅 管理 DLT 管道的 Python 依赖项。
不支持修改流式表架构的数据操作语言(DML)查询。
在 DLT 管道中创建的具体化视图不能用作该管道外部(例如,在另一个管道或下游笔记本中)的流式处理源。
具体化视图和流式处理表的数据存储在它们所处的架构的存储位置中。 如果未指定架构存储位置,则表存储在目录存储位置。 如果未指定架构和目录存储位置,表将存储在元存储的根存储位置。
目录资源管理器的“历史记录”选项卡不显示具体化视图的历史记录。
定义表时不支持
LOCATION
属性。启用了 Unity Catalog 的管道无法发布到 Hive 元数据库。
Python UDF 支持为公共预览版。
不能将 Delta Sharing 与发布到 Unity Catalog 的 DLT 物化视图或流表一起使用。
备注
支持具体化视图的基础文件可能包含来自上游表的数据(包括可能的个人身份信息),这些数据未出现在具体化视图定义中。 此数据会自动添加到基础存储,从而支持具体化视图的增量刷新。
由于具体化视图的基础文件可能会暴露来自不属于具体化视图架构的上游表的数据,因此 Databricks 建议不要与不受信任的下游使用者共享基础存储。
例如,假设具体化视图定义包含 COUNT(DISTINCT field_a)
子句。 即使具体化视图定义仅包含聚合COUNT DISTINCT
子句,基础文件也会包含field_a
的实际值列表。
工作区可以包含使用 Unity Catalog 和旧的 Hive 元存储的管道。 但是,单个管道无法将内容写入 Hive 元存储和 Unity Catalog。 将内容写入 Hive 元存储的现有管道无法通过升级来使用 Unity Catalog。 若要迁移写入到 Hive 元存储的现有管道,必须创建新管道,并从数据源重新引入数据。 请参阅通过克隆 Hive 元存储管道创建 Unity Catalog 管道。
未使用 Unity Catalog 的现有管道不受配置有 Unity Catalog 的新管道的影响。 这些管道继续使用配置的存储位置,将数据保存到 Hive 元存储。
除非本文档另有说明,所有现有的数据来源和 DLT 功能都由使用 Unity Catalog 的管道支持。 使用 Unity Catalog 的管道支持 Python 和 SQL 接口。
当 DLT 配置为将数据保存到 Unity 目录时,DLT 管道将管理表的生命周期和权限。 因此:
- 当某个表从管道定义中被删除,下次更新管道时,会标记相应的具体化视图或流式表条目为非活动状态。 仍可以查询非活动表,但不会更新。 若要清理具体化视图或流式处理表,可以显式
DROP
该表。- 可以使用
UNDROP
命令在 7 天内恢复任何已删除的表。 - 若要保留在下次管道更新时从 Unity Catalog 中移除具体化视图或流式处理表条目的旧行为,请设置管道配置
"pipelines.dropInactiveTables": "true"
。 实际数据会保留一段时间,以便误删时可以恢复。 通过将具体化视图或流式处理表添加回管道定义,可以在 7 天内恢复数据。
- 可以使用
- 删除 DLT 管道会导致删除该管道中定义的所有表。 由于此更改,DLT UI 会更新,提示确认删除管道。
- 用户无法直接访问内部支持表,包括用于支持
APPLY CHANGES INTO
的内部支持表。
若要将表写入 Unity Catalog,必须将管道配置为通过工作区使用它。 创建管道时,在“存储”选项下选择 Unity 目录,在“目录”下拉菜单中选择目录,然后选择现有架构,或在“目标架构”下拉菜单中输入新架构的名称。 若要了解 Unity Catalog 目录,请参阅 Azure Databricks 中的目录是什么?。 若要了解 Unity Catalog 中的架构,请参阅 Azure Databricks 中的架构是什么?。
配置为使用 Unity Catalog 的管道可从以下位置读取数据:
- Unity Catalog 托管的和外部的表、视图、具体化视图和流式处理表。
- Hive 元存储表和视图。
- 自动加载器使用
read_files()
函数从 Unity Catalog 的外部位置读取数据。 - Apache Kafka 和 Amazon Kinesis。
下面是从 Unity Catalog 和 Hive 元存储表读取数据的示例。
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
my_catalog.my_schema.table1;
@dlt.table
def table_name():
return spark.read.table("my_catalog.my_schema.table")
CREATE OR REFRESH STREAMING TABLE
table_name
AS SELECT
*
FROM
STREAM(my_catalog.my_schema.table1);
@dlt.table
def table_name():
return spark.readStream.table("my_catalog.my_schema.table")
使用 Unity Catalog 的管道可以使用 hive_metastore
目录从 Hive 元存储表读取数据:
CREATE OR REFRESH MATERIALIZED VIEW
table_name
AS SELECT
*
FROM
hive_metastore.some_schema.table;
@dlt.table
def table3():
return spark.read.table("hive_metastore.some_schema.table")
CREATE OR REFRESH STREAMING TABLE table_name
AS SELECT *
FROM STREAM read_files(
"/path/to/uc/external/location",
format => "json"
)
@dlt.table(table_properties={"quality": "bronze"})
def table_name():
return (
spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "json")
.load(f"{path_to_uc_external_location}")
)
默认情况下,只有管道所有者有权查询管道创建的数据集。 可以使用 GRANT 语句授予其他用户查询表的能力,并可以使用 REVOKE 语句撤销查询访问权限。 有关 Unity Catalog 中的特权的详细信息,请参阅管理 Unity Catalog 中的特权。
GRANT SELECT ON TABLE
my_catalog.my_schema.table_name
TO
`user@databricks.com`
REVOKE SELECT ON TABLE
my_catalog.my_schema.table_name
FROM
`user@databricks.com`
GRANT CREATE { MATERIALIZED VIEW | TABLE } ON SCHEMA
my_catalog.my_schema
TO
{ principal | user }
DLT 管道中表的世系在目录资源管理器中可见。 对于已启用 Unity Catalog 的管道中的具体化视图或流式处理表,目录资源管理器世系 UI 会显示上游表和下游表。 若要了解有关 Unity 目录世系的详细信息,请参阅 使用 Unity 目录查看数据世系。
对于已启用 Unity Catalog 的 DLT 管道中的具体化视图或流式处理表,如果可以从当前工作区访问管道,则目录资源管理器世系 UI 还会链接到生成了具体化视图或流式处理表的管道。
可使用数据操作语言 (DML) 语句(包括插入、更新、删除和合并语句)来修改发布到 Unity Catalog 的流式处理表。 支持对流式表进行 DML 查询,使得可以实现一些用例,例如更新表以符合《通用数据保护条例》(GDPR)的要求。
备注
- 不支持用于修改流式处理表的表架构的 DML 语句。 确保 DML 语句不会尝试修改表架构。
- 只能在使用 Databricks Runtime 13.3 LTS 及更高版本的 Unity Catalog 共享群集或 SQL 仓库中运行用于更新流式表的 DML 语句。
- 由于流式传输要求仅追加数据源,因此如果你的处理需要从包含更改的源流式传输表进行流式传输(例如,通过 DML 语句),请在读取源流式传输表时设置 skipChangeCommits 标志。 设置
skipChangeCommits
后,将会忽略删除或修改源表上记录的事务。 如果你的处理不需要某个流式处理表,则可使用具体化视图(没有“仅追加”限制)作为目标表。
下面是用于修改流式表中的记录的 DML 语句示例。
DELETE FROM my_streaming_table WHERE id = 123;
UPDATE my_streaming_table SET name = 'Jane Doe' WHERE id = 123;
重要
此功能目前以公共预览版提供。
行筛选器允许指定在表扫描提取行时作为筛选器应用的函数。 这些筛选器可确保后续查询仅返回符合筛选条件结果为 true 的行。
每当表扫描提取行时,列掩码就会让你将列值掩码。 该列的将来查询将返回被评估函数的结果,而不是该列的原始值。 有关使用行筛选器和列掩码的详细信息,请参阅使用行筛选器和列掩码筛选敏感表数据。
在具体化视图和流式处理表上,应通过 CREATE OR REFRESH
语句添加、更新或删除行筛选器和列掩码。
有关使用行筛选器和列掩码定义表的详细语法,请参阅 DLT SQL 语言参考 和 DLT Python 语言参考。
以下是在 DLT 管道中使用行筛选器或列掩码时的重要详细信息:
-
以所有者身份刷新:当管道更新刷新具体化视图或流式表时,行筛选器和列掩码函数以管道所有者权限运行。 这意味着,表刷新使用已创建此管道的用户的安全性上下文。 系统使用管道所有者的用户上下文计算检查用户上下文的函数(例如
CURRENT_USER
和IS_MEMBER
)。 -
查询:查询具体化视图或流式表时,系统使用调用程序用户上下文计算检查用户上下文的函数(例如
CURRENT_USER
和IS_MEMBER
)。 此方法基于当前用户的上下文强制实施特定于用户的数据安全和访问控制。 - 在包含行筛选器和列掩码的源表上创建具体化视图时,具体化视图的刷新始终是完全刷新。 完全更新会按照最新定义重新处理源中所有可用数据。 此过程检查是否使用了最新的数据和定义来评估和应用源表上的安全策略。
使用 DESCRIBE EXTENDED
、INFORMATION_SCHEMA
或目录资源管理器检查适用于给定具体化视图或流式处理表的现有行筛选器和列掩码。 此功能允许用户审核和审查有关具体化视图和流数据表的数据访问和保护措施。