External Catalog
External Catalog 是 Lakehouse 中的目录对象,映射外部数据系统(Hive、Databricks、Snowflake Iceberg 等)的数据库结构,让用户通过标准 SQL 直接查询外部数据,无需复制数据。
什么是 External Catalog
External Catalog 是 Lakehouse 中的目录对象,映射外部数据系统的数据库结构。通过 External Catalog,用户可以:
- 在 Lakehouse 中执行只读查询访问外部数据
- 将外部数据导入 Lakehouse 构建统一数据湖
- 统一管理多个数据源的元数据
核心特点:
- 只读访问:External Catalog 仅支持查询,不支持修改外部数据
- 无需复制:数据保留在外部系统中,Lakehouse 仅读取元数据和数据文件
- 统一入口:通过标准 SQL 查询外部数据,如同查询本地表
架构原理
Lakehouse External Data Source
+------------------------+ +---------------------------+
| | | |
| SQL Query Engine | | Hive Metastore |
| | | or Iceberg |
| SELECT * FROM |--- query -> REST Catalog |
| ext_catalog.schema | | or Databricks |
| .table | | |
| | | |
| Catalog Connection |--- auth --> Data Files | | (credentials) | | (OSS/S3/HDFS) |
+------------------------+ +---------------------------+
与数据同步的对比
| 维度 | External Catalog | 数据同步 |
|---|
| 数据位置 | 保留在外部系统 | 复制到 Lakehouse |
| 查询延迟 | 取决于网络和数据源性能 | 本地查询,性能更优 |
| 存储成本 | 不占用 Lakehouse 存储 | 占用 Lakehouse 存储 |
| 数据一致性 | 实时(直接读外部数据) | 有延迟(取决于同步频率) |
| 适用场景 | 临时查询、数据探索、联邦分析 | 频繁查询、数据加工、数仓建设 |
支持的数据源
| 数据源 | 连接方式 | 说明 |
|---|
| Apache Hive | Hive Metastore URIs | 通过 Hive Metastore 访问 Hive 表 |
| Databricks Unity Catalog | Databricks API | 访问 Databricks 中的表 |
| Iceberg REST Catalog | Iceberg REST Catalog API | 连接任意符合 Iceberg REST Catalog 标准的外部目录 |
| Snowflake Open Catalog | Iceberg REST Catalog + OAuth | 访问 Snowflake 中的 Iceberg 表 |
通用 Iceberg REST Catalog 说明
Lakehouse 支持通过 Iceberg REST Catalog 协议连接任何符合该标准的外部目录服务,不限于 Snowflake。常见的应用场景包括:
- 连接自建的 Iceberg REST Catalog 服务
- 连接第三方数据平台的 Iceberg Catalog
- 连接 Dremio、Polaris、Unity Catalog 等其他支持 Iceberg REST API 的服务
连接架构:
Lakehouse Iceberg REST Catalog
+------------------------+ +----------------------------------+
| | | |
| SQL Query Engine | | Any Iceberg REST Catalog |
| | | (self-hosted / third-party) |
| SELECT * FROM |--- REST API -----> Iceberg Metadata |
| iceberg_catalog | | |
| .schema.table | | |
| | | |
| Catalog Connection |--- Auth ---------> Data Files | | (credentials) | | (OSS/S3/HDFS/GCS) |
+------------------------+ +----------------------------------+
连接步骤:
- 创建 Storage Connection(指定底层存储类型:OSS/S3/HDFS 等)
- 创建 Catalog Connection(
TYPE ICEBERG_REST
TYPE ICEBERG_REST
,配置 URI 和认证信息)
- 创建 External Catalog
详细配置指南:利用 External Catalog 访问 Snowflake OpenCatalog 的 Iceberg 表
Snowflake Open Catalog 说明
Snowflake Open Catalog 是基于 Iceberg REST Catalog 协议的具体实现。Lakehouse 通过 Iceberg REST Catalog 协议连接 Snowflake Open Catalog,实现跨平台数据联邦查询。
连接架构:
Lakehouse Snowflake Open Catalog
+------------------------+ +----------------------------------+
| | | |
| SQL Query Engine | | Polaris Catalog (Iceberg REST) |
| | | |
| SELECT * FROM |--- REST API -----> Iceberg Metadata | | snowflake_catalog | | |
| .schema.table | | |
| | | |
| Catalog Connection |--- OAuth ---------> S3 Data Files | | (OAuth credentials) | | (Snowflake 托管存储) |
+------------------------+ +----------------------------------+
使用限制:
- 仅支持只读查询,不支持写入和更新操作
- 外部表名必须与 Snowflake 中的源表名完全匹配(小写)
- 在 Snowflake 侧需开启 Credential Vending 配置
详细配置指南:利用 External Catalog 访问 Snowflake OpenCatalog 的 Iceberg 表
关键配置参数:
| 参数 | 说明 | 示例 |
|---|
| TYPE | 连接类型,固定为 ICEBERG_REST
ICEBERG_REST | ICEBERG_REST
ICEBERG_REST |
| URI | Polaris API 端点或自定义 REST Catalog 地址 | https://account.snowflakecomputing.com/polaris/api/catalog
https://account.snowflakecomputing.com/polaris/api/catalog |
| OAUTH_CLIENT_ID | OAuth 客户端 ID | 在 Service Connection 创建时获取 |
| OAUTH_CLIENT_SECRET | OAuth 客户端密钥 | 在 Service Connection 创建时获取 |
| NAMESPACE | Catalog 命名空间 | my_catalog.my_schema
my_catalog.my_schema |
| WAREHOUSE | Catalog 名称 | my_warehouse
my_warehouse |
使用限制:
- 仅支持只读查询,不支持写入和更新操作
- 外部表名必须与 Snowflake 中的源表名完全匹配(小写)
- 在 Snowflake 侧需开启 Credential Vending 配置
详细配置指南:利用 External Catalog 访问 Snowflake OpenCatalog 的 Iceberg 表
核心概念
Catalog Connection
Catalog Connection 是连接外部数据源的安全对象,包含:
- 外部数据源的访问地址
- 认证信息(Access Key、Secret Key、OAuth Token 等)
- 网络配置(是否需要 PrivateLink)
External Catalog
External Catalog 是基于 Catalog Connection 创建的目录对象,镜像了外部数据源的数据库结构:
- External Catalog → 外部数据库/命名空间
- External Schema → 外部 Schema
- External Table → 外部表
External Schema
External Schema 是 External Catalog 下的命名空间,对应外部数据源中的 Schema/Database。
External Table
External Table 是 External Schema 下的表对象,对应外部数据源中的表。查询 External Table 时,Lakehouse 会:
- 从外部 Metastore 获取表的元数据(列定义、存储位置等)
- 直接从外部存储(OSS/S3/HDFS)读取数据文件
- 在 Lakehouse 引擎中执行查询计算
典型应用场景
场景 1:历史数据查询
企业将历史数据保留在 Hive 中,通过 External Catalog 查询历史数据:
- 无需将大量历史数据导入 Lakehouse
- 按需查询,节省存储成本
- 统一 SQL 接口,无需学习新工具
场景 2:跨平台数据联邦
同时查询 Lakehouse 本地数据和 Databricks 中的数据:
-- 关联查询本地表和外部表
SELECT l.order_id, l.amount, e.customer_name
FROM local_orders l
JOIN databricks_catalog.sales_schema.customers e
ON l.customer_id = e.customer_id;
场景 3:数据迁移前的验证
在将数据从外部系统迁移到 Lakehouse 之前:
- 通过 External Catalog 验证数据完整性
- 对比迁移前后的数据一致性
- 确认数据质量后再执行迁移
操作流程
1. Create Storage Connection
|
v
2. Create Catalog Connection
|
v
3. Create External Catalog
|
v
4. Query external data: SELECT * FROM ext_catalog.schema.table
权限管理
- 目前创建的 External Catalog 只有
instance_admin
instance_admin
角色可以查询
- 需要通过 Catalog Connection 的认证信息访问外部数据源
- 外部数据源本身也需要配置相应的访问权限
注意事项
- 只读访问:External Catalog 不支持 INSERT/UPDATE/DELETE 操作
- 性能考虑:跨网络查询外部数据可能比本地查询慢
- 认证安全:Catalog Connection 包含敏感认证信息,需妥善保管
- 网络连通:确保 Lakehouse 与外部数据源之间的网络连通
典型操作示例
以下示例基于真实环境执行,使用
clickzetta_sample_data
clickzetta_sample_data
(SHARED 类型)和
databricks_main_catalog
databricks_main_catalog
(EXTERNAL 类型)演示常见操作。
1. 查看所有 Catalog
SHOW CATALOGS;
+----------------------------+-------------------------+----------+
| workspace_name | created_time | category |
+----------------------------+-------------------------+----------+
| clickzetta_sample_data | 2025-01-15 10:27:21.738 | SHARED |
| databricks_main_catalog | 2025-11-20 12:00:49.498 | EXTERNAL |
| ns227206 | 2025-01-15 10:29:17.425 | MANAGED |
+----------------------------+-------------------------+----------+
category
category
字段说明:
MANAGED
MANAGED
为本地托管 Catalog,
SHARED
SHARED
为共享数据集,
EXTERNAL
EXTERNAL
为外部 Catalog。
2. 查看 External Catalog 详情
DESC CATALOG databricks_main_catalog;
+--------------------+-------------------------+
| info_name | info_value |
+--------------------+-------------------------+
| name | databricks_main_catalog |
| creator | qiliang |
| created_time | 2025-11-20 12:00:49.498 |
| last_modified_time | 2025-11-20 12:00:49.498 |
| comment | |
| type | external |
| connection_name | qiliang_databricks_conn |
| origin_catalog | main |
+--------------------+-------------------------+
connection_name
connection_name
是该 Catalog 使用的 Catalog Connection 名称,
origin_catalog
origin_catalog
是外部系统中对应的 Catalog 名称。
3. 浏览 Catalog 结构
-- 查看 Catalog 下的 Schema 列表
SHOW SCHEMAS IN clickzetta_sample_data;
+---------------------------+
| schema_name |
+---------------------------+
| ecommerce_events_history |
| tpcds_10tb |
| tpch_100g |
| nyc_taxi_tripdata |
+---------------------------+
-- 查看 Schema 下的表列表
SHOW TABLES IN clickzetta_sample_data.tpch_100g;
4. 查询外部 Catalog 中的表
使用三层命名结构
catalog_name.schema_name.table_name
catalog_name.schema_name.table_name
直接查询外部数据:
SELECT * FROM clickzetta_sample_data.tpch_100g.region LIMIT 5;
+-------------+-------------+------------------------------------------------------+
| r_regionkey | r_name | r_comment |
+-------------+-------------+------------------------------------------------------+
| 0 | AFRICA | lar deposits. blithely final packages cajole. reg... |
| 1 | AMERICA | hs use ironic, even requests. s |
| 2 | ASIA | ges. thinly even pinto beans ca |
| 3 | EUROPE | ly final courts cajole furiously final excuse |
| 4 | MIDDLE EAST | uickly special accounts cajole carefully blithely... |
+-------------+-------------+------------------------------------------------------+
5. 跨 Catalog 联合查询
将外部 Catalog 中的表与 Lakehouse 本地表进行 JOIN,无需提前复制数据:
-- 关联外部 Catalog 中的 region 表和 nation 表,统计各大洲的国家数量
SELECT
r.r_name AS region_name,
COUNT(n.n_nationkey) AS nation_count
FROM clickzetta_sample_data.tpch_100g.region r
JOIN clickzetta_sample_data.tpch_100g.nation n
ON r.r_regionkey = n.n_regionkey
GROUP BY r.r_name
ORDER BY nation_count DESC;
跨平台联邦查询示例(本地表 JOIN 外部 Catalog 表):
-- 将 Lakehouse 本地订单表与外部 Catalog 中的客户维度表关联
SELECT
o.order_id,
o.amount,
c.c_name AS customer_name,
c.c_nation AS customer_nation
FROM local_schema.orders o
JOIN ext_hive_catalog.sales_schema.customers c
ON o.customer_id = c.c_custkey
WHERE o.order_date >= '2024-01-01'
LIMIT 10;
-- 注意:ext_hive_catalog 需提前通过 CREATE EXTERNAL CATALOG 注册
相关文档