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
catalog.schema.table
),数据分两类存储:

  • External 表:数据文件在客户自己的 S3/ADLS,Databricks 只管元数据
  • Managed 表:数据文件在 Databricks 托管存储,外部无法直接访问

这个差异决定了联邦读的范围——只有 External Delta 表可以被 Lakehouse 的 External Catalog 直接联邦查询,Managed 表必须通过 Studio 同步任务搬迁。



路径 A:联邦直读(External Delta 专属)

联邦读通过 Lakehouse External Catalog 直接查询 Databricks 的表,数据不动,适合过渡期并行访问或 PoC 验证。

配置(一次性)

-- Step 1: 创建到 Databricks 的 Catalog Connection CREATE CATALOG CONNECTION IF NOT EXISTS databricks_conn TYPE = DATABRICKS_UNITY_CATALOG PROPERTIES ( 'host' = 'https://dbc-xxxx.cloud.databricks.com', 'catalog' = 'workspace' -- 认证参数通过 Studio 界面配置 ); -- Step 2: 创建 External Catalog(联邦入口) CREATE EXTERNAL CATALOG IF NOT EXISTS databricks_new_catalog USING CONNECTION databricks_conn;

联邦查询

-- 直接查 Databricks 里的表(跨区/跨云均可,走公网) SELECT * FROM databricks_new_catalog.table_types_demo.customers_external; SELECT COUNT(*) FROM databricks_new_catalog.table_types_demo.orders_external; -- CTAS:把联邦表落地为 Lakehouse 原生表(Optional) CREATE TABLE delta_migration.customers AS SELECT * FROM databricks_new_catalog.table_types_demo.customers_external;

联邦读限制

联邦读只支持 External Delta 格式。实测结论:

尝试表格式结果
customers_external
customers_external
External Delta✅ 7 行,schema/类型正确
orders_external
orders_external
External Delta✅ 8 行,聚合正常
inventory_delta
inventory_delta
External Delta✅ 4 行
customers_managed
customers_managed
Managed Delta❌ 数据在 Databricks 托管存储,外部无访问权限
products_parquet
products_parquet
External Parquet
unsupported databricks table format [PARQUET]
unsupported databricks table format [PARQUET]
suppliers_csv
suppliers_csv
External CSV
unsupported databricks table format [CSV]
unsupported databricks table format [CSV]
shipments_iceberg
shipments_iceberg
Managed Iceberg❌ S3 400(数据在 Databricks 托管桶)
customer_orders_view
customer_orders_view
View❌ 不支持

路径 B:Studio 内置同步(全类型通吃)

Studio 内置 Databricks 数据源,可视化配置同步任务,把各类表搬进 Lakehouse 原生格式。

配置步骤

  1. Studio UI → 数据集成 → 新建数据源 → 选择 Databricks
  2. 填写 Databricks Workspace URL + 认证信息(Service Principal)
  3. 新建同步任务 → 选择源表 → 配置目标 schema → 执行

实测结果(7 种表类型全部 SUCCESS)

在真实 Databricks 环境(AWS us-east-1,Unity Catalog)对

table_types_demo
table_types_demo
schema 下的各类表运行同步任务,全部成功:

源表类型运行结果耗时源行数目标行数一致
customers_managed
customers_managed
Managed Delta~88s77
customers_external
customers_external
External Delta~84s77
products_parquet
products_parquet
Parquet~87s55
suppliers_csv
suppliers_csv
CSV~93s33
product_reviews_json
product_reviews_json
JSON~109s33
shipments_iceberg
shipments_iceberg
Managed Iceberg~92s55
customer_orders_view
customer_orders_view
View~86s88

数据一致性验证

对 5 张表做字段级逐行比对(Databricks SDK 读源、cz-cli 读目标),结论:

  • products_parquet
    products_parquet
    product_reviews_json
    product_reviews_json
    shipments_iceberg
    shipments_iceberg
    suppliers_csv
    suppliers_csv
    所有字段完全一致
  • customers_external
    customers_external
    suppliers_csv
    suppliers_csv
    :email/contact_email 字段在 Lakehouse 侧显示脱敏值(如
    a***@example.com
    a***@example.com

Delta 专有特性处理

特性迁移影响
Deletion Vectors(删除向量)✅ 联邦读正确识别 DV,被删行不会读出;同步到 Lakehouse 后数据状态一致
Change Data Feed(CDF)当前数据正常同步;CDF 增量消费接口(
table_changes()
table_changes()
)在 Lakehouse 无等价 → 需改用 Lakehouse Table Stream 重建增量管道
Liquid Clustering不影响数据内容;迁移到 Lakehouse 后按 Lakehouse 的
CLUSTER BY
CLUSTER BY
或索引机制重建布局优化

连通性说明

  • 跨区/跨云均可:联邦读和 Studio 同步走公网,实测 Lakehouse AWS 新加坡 ↔ Databricks us-east-1 跨区跨云可通
  • 唯一硬限制
    COPY INTO
    COPY INTO
    /
    Pipe
    Pipe
    的对象存储连接不能跨云厂商(如阿里云实例连不了 AWS S3),但这影响的是直接读 S3 文件,不影响通过 Databricks External Catalog 读表

注意事项

  • Managed 表联邦读不了:Managed Delta/Iceberg 数据在 Databricks 托管存储,外部无访问权限,必须用 Studio 同步
  • Parquet/CSV/JSON External 表联邦读不了:External Catalog 目前只支持 Delta 格式,其他格式用 Studio 同步
  • Array 列暂不支持同步:含
    ARRAY<...>
    ARRAY<...>
    类型的列,Studio 同步任务暂不支持,源侧可用
    to_json()
    to_json()
    转成 STRING 后再同步
  • 逐表配置同步任务:Studio 内置 Databricks 数据源暂不支持整库批量同步,需按表逐个配置;可用脚本批量生成配置

相关文档

联邦查询

数据摄取

其他迁移实战

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询