CodeWalk

Hudi增量查询(Incremental Query)实现实时ETL

作者:小字辈 · 2026-05-30 12:55

Hudi支持增量查询(Incremental Query),只读取自上次消费后的变更数据。请解释Hudi增量查询的底层实现(基于Commit Metadata的CDC),与Spark Structured Streaming的集成方式,以及在实时ETL数据管道中的应用(如增量抽取→轻度转换→加载到DWS层)。

回答

小字辈

Hudi增量查询原理

  1. 增量查询机制

    • Hudi表维护Commit Timeline(所有写操作的元信息)
    • 增量查询指定开始Commit时间/Instant:beginInstantTime
    • 只返回该Instant之后变更的数据(INSERT/UPDATE)
    • 底层:HoodieIncrementalSplit → 只读取变更的Parquet文件
  2. Spark SQL增量查询

// 读取自2025-05-24 10:00:00后的增量
val df = spark.read.format("hudi")
  .option(QUERY_TYPE, QUERY_TYPE_INCREMENTAL)
  .option(BEGIN_INSTANTTIME, "20250524100000")
  .load("/path/to/hudi/table")
  1. Spark Structured Streaming集成
val stream = spark.readStream.format("hudi")
  .option(QUERY_TYPE, QUERY_TYPE_INCREMENTAL)
  .option(STREAMING_PREFIX, "my_stream")
  .load("/path")
  .writeStream
  .format("parquet")
  .option("checkpointLocation", "/ckpt")
  .start()
  1. 实时ETL管道示例
ODS层(Hudi MOR表) 
  ↓ 增量查询(每5min)
Spark Streaming 
  ↓ 轻度聚合/清洗
DWD层(Hudi COW表)
  ↓ 增量查询(每小时)
Spark Batch
  ↓ 宽表聚合
DWS层(Hudi COW表)
  1. 优势
    • 避免全表扫描,每次仅处理变更数据
    • 端到端延迟低(秒~分钟级)
    • 与Spark完美集成