从 Iceberg 客户端读取 Databricks 表

使用 Iceberg REST 目录,从支持的 Iceberg 客户端(包括 Apache Spark、Apache Flink、Trino 和 Snowflake)读取 Azure Databricks 上的 Unity Catalog 注册表。

有关受支持的集成的完整列表,请参阅 Unity 目录集成

使用 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)的 Unity Catalog 外部表存储于 Delta Lake。

请参阅 使用 Iceberg 客户端读取 Delta 表

必须完成以下配置步骤,才能使用 Iceberg REST 目录配置从 Iceberg 客户端读取 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 集成的文档

使用 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 "Authorization: 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.chinacloudapi.cn/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.chinacloudapi.cn": "<temporary-sas-token>"
  }
}

注意

响应中的 expires-at-ms 字段指示凭证的过期时间,默认的过期时间为 1 小时。 要获得更好的性能,请让客户端在过期时间到来前缓存凭证,然后再请求新凭证。