Databricks Delta 表 → Lakehouse 迁移实战
Databricks 上的数据几乎都能迁到 ClickZetta Lakehouse。有两条互补的路:联邦直读(数据不动,直接在 Lakehouse 查 Databricks 的表)和 Studio 内置同步(把各类表搬进 Lakehouse 原生格式)。7 种表类型全部实测通过,行数与字段值完全一致。
完整代码见 GitHub:databricks2lakehouse-delta
结论先行
两条路,选型口诀:能联邦读的(External Delta)走联邦 + CTAS;其余一切走 Studio 内置同步。
| 表类型 | 联邦直读 | Studio 同步 | 推荐路径 |
|---|---|---|---|
| External Delta | ✅ 实测 | ✅ 实测 | 联邦直读(不搬数据)或 CTAS 落地 |
| Managed Delta | ❌ | ✅ 实测 | Studio 内置同步 |
| Parquet 外部表 | ❌ | ✅ 实测 | Studio 内置同步 |
| CSV 外部表 | ❌ | ✅ 实测 | Studio 内置同步 |
| JSON 外部表 | ❌ | ✅ 实测 | Studio 内置同步 |
| Managed Iceberg | ❌ | ✅ 实测 | Studio 内置同步 |
| View | ❌ | ✅ 实测(物化为表) | Studio 内置同步 |
技术背景
Databricks 使用 Unity Catalog 三层命名(
catalog.schema.table),数据分两类存储:
- External 表:数据文件在客户自己的 S3/ADLS,Databricks 只管元数据
- Managed 表:数据文件在 Databricks 托管存储,外部无法直接访问
这个差异决定了联邦读的范围——只有 External Delta 表可以被 Lakehouse 的 External Catalog 直接联邦查询,Managed 表必须通过 Studio 同步任务搬迁。
路径 A:联邦直读(External Delta 专属)
联邦读通过 Lakehouse External Catalog 直接查询 Databricks 的表,数据不动,适合过渡期并行访问或 PoC 验证。
配置(一次性)
联邦查询
联邦读限制
联邦读只支持 External Delta 格式。实测结论:
| 尝试表 | 格式 | 结果 |
|---|---|---|
| External Delta | ✅ 7 行,schema/类型正确 |
| External Delta | ✅ 8 行,聚合正常 |
| External Delta | ✅ 4 行 |
| Managed Delta | ❌ 数据在 Databricks 托管存储,外部无访问权限 |
| External Parquet | ❌ |
| External CSV | ❌ |
| Managed Iceberg | ❌ S3 400(数据在 Databricks 托管桶) |
| View | ❌ 不支持 |
路径 B:Studio 内置同步(全类型通吃)
Studio 内置 Databricks 数据源,可视化配置同步任务,把各类表搬进 Lakehouse 原生格式。
配置步骤
- Studio UI → 数据集成 → 新建数据源 → 选择 Databricks
- 填写 Databricks Workspace URL + 认证信息(Service Principal)
- 新建同步任务 → 选择源表 → 配置目标 schema → 执行
实测结果(7 种表类型全部 SUCCESS)
在真实 Databricks 环境(AWS us-east-1,Unity Catalog)对
table_types_demo schema 下的各类表运行同步任务,全部成功:
| 源表 | 类型 | 运行结果 | 耗时 | 源行数 | 目标行数 | 一致 |
|---|---|---|---|---|---|---|
| Managed Delta | ✅ | ~88s | 7 | 7 | ✅ |
| External Delta | ✅ | ~84s | 7 | 7 | ✅ |
| Parquet | ✅ | ~87s | 5 | 5 | ✅ |
| CSV | ✅ | ~93s | 3 | 3 | ✅ |
| JSON | ✅ | ~109s | 3 | 3 | ✅ |
| Managed Iceberg | ✅ | ~92s | 5 | 5 | ✅ |
| View | ✅ | ~86s | 8 | 8 | ✅ |
数据一致性验证
对 5 张表做字段级逐行比对(Databricks SDK 读源、cz-cli 读目标),结论:
、products_parquet
、product_reviews_json
、shipments_iceberg
:所有字段完全一致suppliers_csv
、customers_external
:email/contact_email 字段在 Lakehouse 侧显示脱敏值(如suppliers_csv
)a***@example.com
Delta 专有特性处理
| 特性 | 迁移影响 |
|---|---|
| Deletion Vectors(删除向量) | ✅ 联邦读正确识别 DV,被删行不会读出;同步到 Lakehouse 后数据状态一致 |
| Change Data Feed(CDF) | 当前数据正常同步;CDF 增量消费接口()在 Lakehouse 无等价 → 需改用 Lakehouse Table Stream 重建增量管道 |
| Liquid Clustering | 不影响数据内容;迁移到 Lakehouse 后按 Lakehouse 的 或索引机制重建布局优化 |
连通性说明
- 跨区/跨云均可:联邦读和 Studio 同步走公网,实测 Lakehouse AWS 新加坡 ↔ Databricks us-east-1 跨区跨云可通
- 唯一硬限制:
/COPY INTO
的对象存储连接不能跨云厂商(如阿里云实例连不了 AWS S3),但这影响的是直接读 S3 文件,不影响通过 Databricks External Catalog 读表Pipe
注意事项
- Managed 表联邦读不了:Managed Delta/Iceberg 数据在 Databricks 托管存储,外部无访问权限,必须用 Studio 同步
- Parquet/CSV/JSON External 表联邦读不了:External Catalog 目前只支持 Delta 格式,其他格式用 Studio 同步
- Array 列暂不支持同步:含
类型的列,Studio 同步任务暂不支持,源侧可用ARRAY<...>
转成 STRING 后再同步to_json() - 逐表配置同步任务:Studio 内置 Databricks 数据源暂不支持整库批量同步,需按表逐个配置;可用脚本批量生成配置
相关文档
联邦查询
- External Catalog 概述:External Catalog 联邦查询原理
- 联邦查询指南:SQL 语法与使用示例
数据摄取
- 数据摄取概述:摄取方案全景
- COPY INTO:批量从对象存储加载
- Pipe(持续摄取):持续监听对象存储新文件
其他迁移实战
联系我们
