从 Iceberg 客户端读取 Databricks 表
使用 Iceberg REST 目录,从受支持的 Iceberg 客户端(包括 Apache Spark、Apache Flink、Trino 和 Snowflake)读取 Azure Databricks 上在 Unity Catalog 中注册的表。
使用 Unity Catalog Iceberg 目录终结点读取
Unity Catalog 为启用了 Iceberg 读取的表提供了 Iceberg REST 目录 API 的只读实现。
使用终结点 /api/2.1/unity-catalog/iceberg
配置访问权限。 有关使用此 REST API 的详细信息,请参阅 Iceberg REST API 规范。
注释
Azure Databricks 为一些 Iceberg 读取器客户端引入了凭证售卖。 Databricks 建议使用凭证售卖来控制对受支持系统的云存储空间的访问。 请参阅用于外部系统访问的 Unity Catalog 凭证售卖。
如果客户端不支持凭证售卖,则必须配置从客户端访问云存储位置(包含启用了 Iceberg 读取 (UniForm) 的 Delta 表的文件和元数据)的权限。 有关配置详细信息,请参阅 Iceberg 读取器客户端文档。
要求
Azure Databricks 支持 Iceberg REST 目录访问 Unity Catalog 中的表。 必须在工作区启用 Unity Catalog 才能使用这些终结点。 以下表类型符合 Iceberg REST 目录读取的条件:
- 启用了 Iceberg 读取 (UniForm) 的 Unity Catalog 托管表。
- 启用了 Iceberg 读取 (UniForm) 的使用 Delta Lake 存储的 Unity Catalog 外部表。
必须完成以下配置步骤,才能配置使用 Iceberg REST 目录从 Iceberg 客户端读取 Databricks 表的访问权限:
- 为元存储启用外部数据访问。 请参阅在元存储上启用外部数据访问。
- 授予配置集成的主体对包含表的架构的
EXTERNAL USE SCHEMA
特权。 请参阅向主体授予 EXTERNAL USE SCHEMA 权限。 - 使用 Databricks 个人访问令牌进行身份验证。 请参阅授权访问 Azure Databricks 资源。
使用 Apache Spark 读取 Iceberg 表
以下是配置 Apache Spark 将 Azure Databricks 表读取为 Iceberg 的设置示例:
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
# Configuration for accessing Uniform tables in Unity Catalog
"spark.sql.catalog.<spark-catalog-name>": "org.apache.iceberg.spark.SparkCatalog",
"spark.sql.catalog.<spark-catalog-name>.type": "rest",
"spark.sql.catalog.<spark-catalog-name>.uri": "<workspace-url>/api/2.1/unity-catalog/iceberg",
"spark.sql.catalog.<spark-catalog-name>.token":"<token>",
"spark.sql.catalog.<spark-catalog-name>.warehouse":"<uc-catalog-name>"
替换以下变量:
<uc-catalog-name>
:Unity Catalog 中包含你的表的目录名称。<spark-catalog-name>
:希望在 Spark 会话中分配给目录的名称。<workspace-url>
:Azure Databricks 工作区的 URL。<token>
:配置集成的主体的 PAT 令牌。
借助这些配置,可以使用标识符 <catalog-name>.<schema-name>.<table-name>
在 Apache Spark 中将 Azure Databricks 表作为 Iceberg 查询。 要跨多个目录访问表,必须单独配置每个目录。
使用 Spark 配置查询 Unity Catalog 中的表时,请记住以下几点:
仅当运行特定于 Iceberg 的存储过程时,才需要
"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
。Azure Databricks 会对所有表使用云对象存储。 必须将特定于云的 Iceberg 捆绑包 JAR 添加为 Spark 包:
- AWS:
org.apache.iceberg:iceberg-aws-bundle:<iceberg-version>
- Azure:
org.apache.iceberg:iceberg-azure-bundle:<iceberg-version>
- GCP:
org.apache.iceberg:iceberg-gcp-bundle:<iceberg-version>
有关详细信息,请参阅适用于 Spark 的 Iceberg AWS 集成文档。
- AWS:
使用 Snowflake 读取 Databricks 表
以下是允许 Snowflake 将 Azure Databricks 表作为 Iceberg 读取的建议配置设置的示例:
CREATE OR REPLACE CATALOG INTEGRATION <catalog-integration-name>
CATALOG_SOURCE = ICEBERG_REST
TABLE_FORMAT = ICEBERG
CATALOG_NAMESPACE = '<uc-schema-name>'
REST_CONFIG = (
CATALOG_URI = '<workspace-url>/api/2.1/unity-catalog/iceberg',
WAREHOUSE = '<uc-catalog-name>'
)
REST_AUTHENTICATION = (
TYPE = BEARER
BEARER_TOKEN = '<token>'
)
ENABLED = TRUE;
替换以下变量:
<catalog-integration-name>
:要为注册到 Snowflake 的目录分配的名称。<uc-schema-name>
:需要访问的 Unity Catalog 中架构的名称。<uc-catalog-name>
:需要访问的 Unity Catalog 中目录的名称。<workspace-url>
:Azure Databricks 工作区的 URL。<token>
:配置集成的主体的 PAT 令牌。
REST API curl 示例
还可以使用此 curl
示例中的 REST API 调用来加载表:
curl -X GET -H "Authentication: Bearer $OAUTH_TOKEN" -H "Accept: application/json" \
https://<workspace-instance>/api/2.1/unity-catalog/iceberg/v1/catalogs/<uc_catalog_name>/namespaces/<uc_schema_name>/tables/<uc_table_name>
然后你应该会收到类似于以下内容的响应:
{
"metadata-location": "abfss://my-container@my-storage-account.dfs.core.windows.net/path/to/iceberg/table/metadata/file",
"metadata": <iceberg-table-metadata-json>,
"config": {
"expires-at-ms": "<epoch-ts-in-millis>",
"adls.sas-token.<storage-account-name>.dfs.core.windows.net": "<temporary-sas-token>"
}
}
注释
响应中的 expires-at-ms
字段指示凭证的过期时间,默认的过期时间为 1 小时。 要获得更好的性能,请让客户端在过期时间到来前缓存凭证,然后再请求新凭证。