阿里面試:Paimon Changelog 和 合并引擎有哪些組合,分別適用于哪些場景?
Paimon changelog和合并引擎如何選擇?
Paimon 把「怎么產生 changelog」和「怎么合并多條變更」拆成了兩個正交維度,只要理解下面兩張“坐標軸”,就能拼出所有計算場景:
(1) changelog-producer 軸(行級語義)
- none:不寫 changelog,只能離線查詢。
- input:原樣透傳上游的 +I/-U/+U/-D 消息,適合鏈路里已經有 Flink 狀態、只想把 Paimon 當落地表的“無狀態”場景。
- lookup:每次 Flush 時 Lookup 當前行值,生成完整 -U / +U 對;適合需要回撤語義的流讀。
- full-compaction:只在 Compaction 后生成 changelog,吞吐高、代價小,但延遲取決于 compaction-interval。
(2) merge-engine 軸(列級語義)
- deduplicate(默認):主鍵去重,保留最新整行。
- partial-update:同一主鍵多次更新不同列,空值不覆蓋。
- aggregation:按主鍵對列做預聚合(sum/max/last_non_null…)。
- first-row:保留主鍵第一行,不接受回撤。
下面用四組最常用“坐標點”給出配置范例,每條都能直接復制運行。

場景 1:離線寬表 T+1 快照
changelog-producer = none + merge-engine = deduplicate不需要流讀,只要每天產出一份最新鏡像。
CREATETABLE ods_order (
order_id BIGINT,
user_id STRING,
amount DECIMAL(18,2),
PRIMARYKEY(order_id)NOT ENFORCED
)WITH(
'changelog-producer'='none',
'merge-engine'='deduplicate'
);場景 2:流式 ETL 去重落地
changelog-producer = input + merge-engine = deduplicate上游 Kafka 已帶 -U/+U,無須再次 Lookup,鏈路無狀態,純 Append 寫。
CREATETABLE dwd_order_unique (
order_id BIGINT,
user_id STRING,
amount DECIMAL(18,2),
PRIMARYKEY(order_id)NOT ENFORCED
)WITH(
'changelog-producer'='input',
'merge-engine'='deduplicate'
);場景 3:多流 Join 的 Partial Update(實時寬表)
changelog-producer = full-compaction + merge-engine = partial-update不同作業分別更新不同字段,compaction 后產出完整 -U/+U 給下游。
CREATETABLE dw_order_detail (
order_id STRING,
product_type STRING,
plat_name STRING,
logistics_id BIGINT,
dispatch_time TIMESTAMP(3),
finish_time TIMESTAMP(3),
order_status INT,
update_time TIMESTAMP(3),
PRIMARYKEY(order_id)NOT ENFORCED
)WITH(
'bucket'='20',
'sequence.field'='update_time',
'changelog-producer'='full-compaction',
'changelog-producer.compaction-interval'='2 min',
'merge-engine'='partial-update',
'partial-update.ignore-delete'='true'
);場景 4:實時聚合指標表
changelog-producer = lookup + merge-engine = aggregation需要秒級回撤,故用 lookup;price 列取 max,sales 列做 sum。
CREATETABLE ads_product_amt (
product_id BIGINT,
price DOUBLE,
sales BIGINT,
PRIMARYKEY(product_id)NOT ENFORCED
)WITH(
'changelog-producer'='lookup',
'merge-engine'='aggregation',
'fields.price.aggregate-function'='max',
'fields.sales.aggregate-function'='sum',
'fields.price.ignore-retract'='true',
'fields.sales.ignore-retract'='false'-- 允許回撤
);組合速查表(文字版)
場景描述 | changelog-producer | merge-engine | 下游能否流讀 | 備注 |
離線快照 | none | deduplicate | 否 | 無 changelog,僅批讀 |
流式去重落地 | input | deduplicate | 是 | 上游已有完整 changelog |
實時寬表(多流拼字段) | full-compaction | partial-update | 是 | compaction 后產出 -U/+U,延遲分鐘級 |
實時聚合回撤 | lookup | aggregation | 是 | 逐行 lookup,延遲秒級,支持回撤 |
只保留首行(埋點日志) | lookup | first-row | 是 | 僅 insert 流,無回撤 |
記住口訣:
- 只落盤選 none,上游有變更用 input;
- 要回撤用 lookup,能等 compaction 就用 full-compaction;
- 字段補全用 partial-update,指標匯總用 aggregation,只留最早一條用 first-row。”




























