如果你 启用了对Unity Catalog的外部数据访问,可以为流水线管理的和独立的实体化视图和流表添加外部数据访问。 这使外部 Delta 和 Iceberg 客户端能够通过 Unity 目录和 Iceberg 目录 REST API 访问数据集,而无需完整数据复制。
外部数据访问可用于访问由 Lakeflow 管道管理的数据集,以及独立的物化视图和流式表。
能力
使用外部数据访问可以将Azure Databricks中相同的数据暴露给流水线管理和独立的实体化视图和流表,而无需创建数据的副本。 这为性能和功能提供了以下特征:
- 无需复制数据: 未复制完整数据集,即可启用外部访问。
- 通过 API 进行外部访问: 使用 Delta Lake 或 Iceberg API 读取具体化视图和流式处理表。
- 写后读一致性: 在数据集更新后,外部读取方可以访问最新数据,确保不存在陈旧数据。 刷新后即可立即获取更新。
- 单个表对象: 数据集在外部显示为 托管表 ,其名称与 Unity 目录 API 中的源数据集相同。
- 低成本: 由于未复制完整数据集,因此提供外部访问的开销较低。
Requirements
您的数据集需要满足以下要求:
- Unity Catalog:流式表和物化视图必须使用 Unity Catalog。
- Databricks Runtime 版本: 必须使用 Databricks Runtime 17.3 及更高版本。
- 默认发布模式: 外部可读性仅支持默认发布模式。 要使用外部可读性,迁移 到默认发布模式。 依赖外部元数据的功能(例如物化视图 CDF)将在旧版发布模式下正常工作。
您的客户的要求如下:
- Delta API 版本: 客户端必须支持 Delta Lake API 4.0.0 或更高版本(包括删除向量),并且必须使用 Unity Catalog 目录 API 进行访问。
- Iceberg API 版本: 或者,客户端可以使用支持 Iceberg v3 规范的 Iceberg 目录 API 进行访问。
-
Unity Catalog 权限: 从外部读取数据集的主体必须对该架构具有 EXTERNAL USE SCHEMA 权限,并且对该表具有
SELECT权限。
注意
如果客户端不支持这些要求,还可以使用 兼容模式,该模式支持所有 Delta 和 Iceberg 客户端,但需要创建数据集的完整副本。
如何为数据集启用访问权限
启用数据集外部访问有两个步骤。
通过管道配置或表属性启用外部元数据。 当两者都已设置时,表级设置优先于流水线配置,并且支持流水线管理、独立流式表和实体化视图。
管道配置: 设置为
pipelines.externalMetadata.enabledtrue以启用流水线中所有数据集的外部元数据。 用Databricks SQL创建的独立实体化视图和流表没有流水线配置;改用表属性。流水线设置界面
在流水线设置中,请完成以下步骤:
- 打开管道,然后单击 “设置”。
- 在 “配置”下,添加键值对: 键
pipelines.externalMetadata.enabled、 值true。 - 单击“ 保存”。
管道配置 JSON
在您的管道 JSON 的
configuration部分中,添加:{ "configuration": { "pipelines.externalMetadata.enabled": "true" } }
保存配置后,运行或重启管道以应用更改:
- 已触发的流水线:运行该流水线一次。
- 连续管道:停止并重启管道。
对于独立的Databricks SQL对象,可以使用
CREATE OR REPLACE MATERIALIZED VIEW或CREATE OR REFRESH STREAMING TABLE使用表属性。 创建或刷新语句应用该属性。如果你打算用现代 Iceberg 客户端读取数据集,除了外部元数据属性外,还要添加以下 UniForm Iceberg V3 属性。
财产 使用 'pipelines.externalMetadata.enabled' = 'true'启用桌面的外部访问权限。 当两者都已设置时,表级设置优先于管道配置。 'delta.columnMapping.mode' = 'name'Iceberg 必须使用列映射。 'delta.enableRowTracking' = 'true'为 Iceberg 读取启用行跟踪。 'delta.universalFormat.enabledFormats' = 'iceberg'启用 Iceberg 读取功能。 'delta.enableIcebergCompatV3' = 'true'用 Iceberg V3 来读取 Iceberg。 CREATE OR REFRESH [MATERIALIZED VIEW | STREAMING TABLE] tbl_name TBLPROPERTIES( 'delta.columnMapping.mode' = 'name', 'delta.enableRowTracking' = 'true', 'delta.enableIcebergCompatV3' = 'true', 'delta.universalFormat.enabledFormats' = 'iceberg', 'pipelines.externalMetadata.enabled' = 'true')对于物化视图,你可以改用等效的
USING ICEBERG语法。CREATE OR REFRESH MATERIALIZED VIEW tbl_name USING ICEBERG对于流水线管理的数据集,请使用上述流水线更新指令应用Iceberg属性。 对于独立的Databricks SQL对象,请用更新后的属性重新运行对象定义。 对实体化视图使用
CREATE OR REPLACE MATERIALIZED VIEW,对流式表使用CREATE OR REFRESH STREAMING TABLE。 要查看数据集的属性,可以使用DESCRIBE DETAILorDESCRIBE EXTENDEDSQL 语句。
外部数据访问故障排除
如果你认为外部元数据已经过时,拥有 MODIFY 表权限的主体可以通过 Databricks 运行时 17.3 或更高版本手动触发共享集群计算中的元数据更新:
REPAIR TABLE <catalog>.<schema>.<table-name> SYNC METADATA;
你可以在 Catalog Explorer 界面的表详细信息页面上查看是否存在 Iceberg 元数据。 或者,在 SQL 编辑器或Azure Databricks笔记本中运行以下命令:
DESCRIBE DETAIL <catalog>.<schema>.<table-name>;
DESCRIBE EXTENDED <catalog>.<schema>.<table-name>;
对于流式表,可以比较 Iceberg 元数据版本与最新的流式表版本。 具体化视图的版本对比尚未可用。
从外部客户端读取数据
以下章节提供了如何从不同客户端和环境中读取数据集的示例。
有关设置细节,请参见 Delta客户端访问 和 Iceberg客户端访问。
将 Unity REST API 与 Spark 增量读取器配合使用
使用 Apache Spark™ 4.0 或更高版本。 您可以从 https://spark.apache.org/downloads.html 下载。
根据云提供商,运行以下命令,使用 Delta 4.0 和 Unity 目录启动 Spark SQL shell。
蔚蓝
bin/spark-sql \ --packages org.apache.hadoop:hadoop-azure:3.3.6,io.unitycatalog:unitycatalog-spark_2.13:0.3.1 \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \ --conf spark.sql.catalog.spark_catalog=io.unitycatalog.spark.UCSingleCatalog \ --conf spark.sql.catalog.<uc-catalog-name>=io.unitycatalog.spark.UCSingleCatalog \ --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url> \ --conf spark.sql.catalog.<uc-catalog-name>.token=<PAT> \ --conf spark.sql.defaultCatalog=<uc-catalog-name>从 SQL shell 中,现在可以使用 Spark SQL 访问数据集。 例如:
spark-sql ()> SELECT * FROM <uc-catalog>.<uc-schema>.<uc-table-name>;
使用 Snowflake Iceberg 读取器
在 Snowflake 中,可以使用冰山阅读器。 这需要在 Snowflake 中支持 Iceberg v3。
在 Snowflake 中设置 Iceberg REST 目录。
CREATE OR REPLACE CATALOG INTEGRATION my_uc_int CATALOG_SOURCE = ICEBERG_REST TABLE_FORMAT = ICEBERG CATALOG_NAMESPACE = '<uc-schema-name>' REST_CONFIG = ( CATALOG_URI = '<workspace-url>/api/2.1/unity-catalog/iceberg-rest' CATALOG_NAME = '<uc-catalog-name>' ACCESS_DELEGATION_MODE = VENDED_CREDENTIALS ) REST_AUTHENTICATION = ( TYPE = BEARER BEARER_TOKEN = '<PAT>' ) ENABLED = TRUE; CREATE OR REPLACE ICEBERG TABLE my_table CATALOG = 'my_uc_int' CATALOG_TABLE_NAME = '<uc-table-name>';从Snowflake SQL访问你的数据集。
ALTER ICEBERG TABLE my_table REFRESH; SELECT * FROM my_table;
将 Iceberg REST 目录与 Spark Iceberg 阅读器配合使用
使用 Apache Spark™ 4.0 或更高版本。 您可以从 https://spark.apache.org/downloads.html 下载。
在 AWS 中运行以下命令,使用 Iceberg v3 启动 Spark SQL shell。
bin/spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-4.0_2.13:1.10.0,org.apache.iceberg:iceberg-aws-bundle:1.10.0 \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.<uc-catalog-name>=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.<uc-catalog-name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO \ --conf spark.sql.catalog.<uc-catalog-name>.type=rest \ --conf spark.sql.catalog.<uc-catalog-name>.uri=<workspace_url>/api/2.1/unity-catalog/iceberg-rest \ --conf spark.sql.catalog.<uc-catalog-name>.token='<PAT>' \ --conf spark.sql.catalog.<uc-catalog-name>.warehouse=<uc-catalog-name> \ --conf spark.sql.iceberg.vectorization.enabled=false从 Spark SQL 访问数据集。
spark-sql ()> SELECT * FROM <uc-catalog>.<uc-schema>.<uc-table-name>;
从兼容性模式迁移
如果当前正在使用 兼容模式共享数据集,则可以迁移到使用外部数据访问。
- 按照 “如何为数据集启用访问权限”中的步骤启用此功能。
- 禁用兼容性模式。 请参阅 “禁用兼容性模式”
局限性
以下是有关流式表和物化视图的外部数据访问的已知限制。