从 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 客户端读取 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 "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 小时。 要获得更好的性能,请让客户端在过期时间到来前缓存凭证,然后再请求新凭证。