Databricks Unity Catalog 联邦查询实践
云器 Lakehouse 通过 External Catalog 直接查询 Databricks Unity Catalog 中的表,数据留在 Databricks 的 S3 存储里不动,Lakehouse 负责 SQL 执行和结果返回。本文以 AWS 环境为例,记录从零配通的完整操作路径。
前置条件
- Databricks 工作区:支持 Unity Catalog(Free Edition 已支持)
- 云器 Lakehouse 实例:与 Databricks 数据存储(S3)在同一云平台(均为 AWS)
- 工具:cz-cli,需提前配好对应 AWS profile
涉及的 SQL 命令
| 命令 | 用途 |
|---|---|
| 存储 Databricks OAuth M2M 认证信息 |
| 创建指向 Databricks Unity Catalog 的外部目录 |
| 列出 Databricks Catalog 中的 Schema |
| 列出 Schema 中的表 |
| 查询 Databricks 表数据 |
Databricks 侧配置
创建 Service Principal
打开
https://accounts.cloud.databricks.com → User management → Service principals → Add service principal,起一个便于识别的名称(如 lakehouse_connector)。
创建后点击 SP 名称进入详情页,依次完成:
- Roles tab → 开启 Account admin
- Principal information tab → 记录 Application ID(即后续用到的
,格式为 UUID)CLIENT_ID - Credentials & secrets tab → Generate secret → 记录生成的完整 Secret(即后续用到的
)CLIENT_SECRET
将 SP 加入 Workspace
在 Databricks Workspace → Settings → Identity and access → Service Principals → Add service principal,将刚创建的 SP 加进来。
开启 Metastore External Data Access
在 Databricks Workspace → Catalog → 齿轮图标 → Metastore → Details tab → 找到 External data access → 打开开关。
不开启此选项,查询数据时会报:
授予 Catalog 和 Schema 权限
在 Databricks Catalog Explorer 里,给 SP 授予以下权限:
- Catalog 层级:
USE CATALOG - Schema 层级:
、USE SCHEMA
、SELECTEXTERNAL USE SCHEMA
如果你有 SQL 执行环境(Notebook 或 SQL Warehouse),也可以用 GRANT 命令完成授权(将
<application-id> 替换为 SP 的 Application ID,格式为 UUID):
创建 Catalog Connection
验证连接:
创建 External Catalog
catalog 的值是 Databricks Unity Catalog 里的 catalog 名称。在 Databricks Workspace → 左侧 Catalog 图标 → 展开左侧面板,My organization 下列出的即为可用 catalog(如 workspace、main、hive_metastore 等)。
验证:
输出示例:
查询数据
联邦查询:跨平台 SQL 分析
联邦查询的核心价值是:Lakehouse 可以直接查询、关联 Databricks 的数据,也可以将 Databricks 数据写入 Lakehouse 本地表,全程无需数据搬迁。
场景一:Databricks 表之间 JOIN
orders_external(订单)和 customers_external(客户)通过 customer_id 关联,统计每个客户的订单数和消费总额。两张表的 price 字段类型均为 DECIMAL(10,2),无需转换:
查询结果:
| customer_name | country | loyalty_tier | order_count | total_revenue |
|---|---|---|---|---|
| Alice Chen | China | Gold | 2 | 1698.99 |
| Frank Liu | China | Silver | 1 | 299.99 |
| Carol Zhang | China | Platinum | 2 | 249.98 |
| David Lee | Singapore | Bronze | 1 | 129.99 |
| Emma Wang | China | Silver | 1 | 89.99 |
场景二:库存不足预警
inventory_delta 记录各仓库库存(字段:product_id、warehouse_location、quantity_available)。查询库存低于阈值的产品,分仓库汇总:
查询结果:
| warehouse_location | low_stock_products | min_stock | avg_stock |
|---|---|---|---|
| Warehouse A | 1 | 50 | 50.0 |
| Warehouse B | 2 | 75 | 112.5 |
场景三:Databricks 数据写入 Lakehouse
联邦查询的结果可以直接写入 Lakehouse 本地表,实现数据汇聚。下面的
public 是 Lakehouse 本地 Schema(不是 Databricks 的),替换成你实际的本地 Schema 名称:
查询本地表,无网络开销:
| order_id | customer_id | order_date | product_name | price | status |
|---|---|---|---|---|---|
| 2006 | 1005 | 2026-05-20 | Webcam HD | 89.99 | Delivered |
| 2001 | 1001 | 2026-05-15 | Laptop Pro | 1299.99 | Delivered |
| 2004 | 1001 | 2026-05-18 | Monitor 27inch | 399.00 | Delivered |
场景四:Dynamic Table 消费 Databricks 数据
将 Databricks 数据作为 Dynamic Table 的上游,定时聚合到 Lakehouse。
public 是 Lakehouse 本地 Schema,替换成你实际的本地 Schema 名称:
首次刷新后查询:
| order_date | order_count | total_revenue | avg_order_value |
|---|---|---|---|
| 2026-05-15 | 1 | 1299.99 | 1299.99 |
| 2026-05-17 | 1 | 49.99 | 49.99 |
| 2026-05-18 | 1 | 399.00 | 399.00 |
| 2026-05-19 | 1 | 129.99 | 129.99 |
| 2026-05-20 | 1 | 89.99 | 89.99 |
| 2026-06-04 | 2 | 499.98 | 249.99 |
支持的表类型
并非所有 Databricks 表都能从 Lakehouse 查询,支持情况取决于表的存储类型:
| 表类型 | 格式 | 支持 | 说明 |
|---|---|---|---|
| Delta | ✅ | 完全支持,推荐 |
| Delta | ✅ | 完全支持 |
(Delta 格式) | Delta | ✅ | 支持 |
(Parquet/CSV/JSON) | 非 Delta | ❌ | 报 |
| Managed Delta | ❌ | 不支持跨平台访问 |
| — | ❌ | driver 兼容性问题 |
关键结论:只有 Delta 格式的表支持联邦查询,无论是 External 还是普通 Delta 表。Parquet、CSV、JSON 格式的外部表目前不支持。
在 Databricks 中建表时,优先使用 Delta 格式:
常见错误排查
invalid_client
invalid_clientOAuth 认证失败。按顺序检查:
- SP 是否已在 Account Console → Roles 里开启 Account admin
- SP 是否已在 Workspace → Settings → Service Principals 里添加
是否是完整值(不是CLIENT_SECRET
这样的脱敏值)——去 Account Console → SP → Credentials & secrets 重新生成一个50db****7f61- Secret 是否已过期——在 Credentials & secrets 页面查看
字段,过期后需生成新 Secret 并重新执行Expires atCREATE CATALOG CONNECTION
PermissionDenied: External Data Access ... is disabled
PermissionDenied: External Data Access ... is disabledMetastore 未开启外部数据访问。在 Databricks Workspace → Catalog → 齿轮 → Metastore → External data access → 开启。
PermissionDenied: User does not have USE CATALOG
PermissionDenied: User does not have USE CATALOGSP 没有 Catalog 访问权限。在 Databricks Catalog Explorer 里找到对应 Catalog → Permissions → Grant → 给 SP 加
USE CATALOG。
PermissionDenied: User does not have EXTERNAL USE SCHEMA
PermissionDenied: User does not have EXTERNAL USE SCHEMASP 没有 Schema 的外部访问权限。在 Databricks Catalog Explorer → Schema → Permissions → Grant → 给 SP 加
USE SCHEMA、SELECT、EXTERNAL USE SCHEMA。
NotFound: Catalog 'main' does not exist
NotFound: Catalog 'main' does not existOPTIONS ('catalog' = ...) 填写的 catalog 名称不存在。打开 Databricks Workspace → Catalog 面板,查看实际的 catalog 名称。
查询超时(300 秒)或 PermanentRedirect
PermanentRedirectACCESS_REGION 填错了,S3 请求被重定向。检查表的实际存储位置(Catalog Explorer → 表详情 → Storage Location),确认 S3 bucket 所在 region 后重建 Catalog Connection。
unsupported databricks table format {} [PARQUET/CSV/JSON]
unsupported databricks table format {} [PARQUET/CSV/JSON]该表使用的是非 Delta 格式,目前不支持从 Lakehouse 查询。在 Databricks 中用 Delta 格式重建该表,或将数据转换为 Delta 表。
Table cannot be accessed from outside of Databricks Compute Environment ... kind being TABLE_DB_STORAGE
Table cannot be accessed from outside of Databricks Compute Environment ... kind being TABLE_DB_STORAGE该表是 Databricks Managed Table(托管表),数据存在 Databricks 控制的存储里,不支持跨平台直接访问。需在 Databricks 中将其转为 External Table 后才能查询。
注意事项
| 注意点 | 说明 |
|---|---|
| 云平台限制 | Databricks 的 S3 存储必须与 Lakehouse 实例在同一云平台(均为 AWS)。Databricks 在 GCP/Azure 时无法与 AWS Lakehouse 互联 |
| region 一致性 | 必须与 S3 bucket 所在 region 一致,不是 workspace region |
| 只读限制 | External Catalog 是只读的——不支持从 Lakehouse 向 Databricks 写入数据(INSERT/UPDATE/DELETE)。反向操作(将 Databricks 数据写入 Lakehouse)完全支持,见场景三 |
| 版本要求 | 需要支持 Unity Catalog 的版本。Free Edition 已支持;Community Edition 不支持 |
| Secret 保存 | OAuth Secret 只在生成时显示完整值,请立即保存;遗失需重新生成 |
相关文档
- 创建 Catalog Connection — 完整 DDL 语法和参数说明
- 创建 Databricks External Catalog — External Catalog DDL 语法
- 联邦查询使用指南 — 联邦查询完整示例
