首页/数据/数据工程与 ETL 速查/CDC 落湖仓:主键 merge 与乱序处理
CDC 与同步53 条

CDC 落湖仓:主键 merge 与乱序处理

数据湖表格式让增量落湖具备主键能力:Hudi 提供 upsert(COW/MOR),Iceberg 支持行级删除与 MERGE INTO,Delta Lake 提供 MERGE。CDC 数据通常按主键 merge 到湖表,用事件时间排序处理乱序,删除按墓碑行或直接删除。

Spark SQL 按主键 MERGE(湖表)

Spark SQL 按主键 MERGE(湖表)
MERGE INTO lake.orders AS t
USING cdc_stage AS s
ON t.order_id = s.order_id
WHEN MATCHED AND s.op = 'd' THEN DELETE
WHEN MATCHED THEN UPDATE SET t.amount = s.amount, t.status = s.status
WHEN NOT MATCHED THEN INSERT (order_id, amount, status)
  VALUES (s.order_id, s.amount, s.status);
HudiCOW/MOR 两种表类型,支持 upsert 与增量读
IcebergMERGE INTO + 行级删除(v2 规范)
DeltaMERGE 与变更数据流
乱序按事件时间做预聚合/取最新,避免旧事件覆盖新值
高频 merge 会产生小文件:需配套 compaction(Hudi clustering、Iceberg rewrite、Delta OPTIMIZE)。

易错点

  • 小文件长期不治理,元数据与查询性能持续恶化
  • 用处理时间而非事件时间排序,晚到的旧事件把新值覆盖回去

数据来源与参考

  • Apache Hudi 官方文档(Upsert)
  • Apache Iceberg 官方文档(MERGE INTO)
  • Delta Lake 官方文档(MERGE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌