在 Apache Paimon 中,主键表和 Append-Only 表 是两种核心表类型,其行为与 merge-engine
和 changelog-producer
的配置密切相关。以下是它们的核心关系与作用机制:
一、主键表(Primary Key Table)
1. 特点
- 主键约束:通过
PRIMARY KEY
定义唯一标识符,支持按主键更新(UPSERT
)和删除(DELETE
)操作。 - 数据合并:依赖
merge-engine
决定相同主键记录的合并策略(如去重、部分更新、聚合)。 - 变更日志生成:通过
changelog-producer
生成完整的变更记录(+I
/-U
/+U
/-D
),供流式消费。
2. 与 merge-engine
的关系
- 功能控制:
merge-engine
定义主键冲突时的合并逻辑,直接影响数据写入和查询行为。deduplicate
:仅保留最新记录,丢弃旧数据。partial-update
:支持多流按字段更新,逐步构建完整记录。aggregation
:对非主键字段预聚合(如SUM
/MAX
)。
- 依赖关系:主键表必须指定
merge-engine
,Append-Only 表无此配置。
3. 与 changelog-producer
的关系
- 变更日志生成模式:
changelog-producer
控制如何生成变更记录:none
:不生成完整变更日志(依赖下游补全)。input
:直接存储输入源的变更事件(如 CDC 的DELETE
事件)。lookup
:通过查询旧值生成-U
事件(适合非 CDC 场景)。full-compaction
:全量合并时生成变更日志(高延迟)。
- 必要性:若需流式消费完整变更日志(如 Flink 实时处理),主键表需配置
changelog-producer
。
4. 典型配置
CREATE TABLE user_behavior (
user_id STRING PRIMARY KEY,
action STRING,
event_time TIMESTAMP
) WITH (
'merge-engine' = 'deduplicate', -- 去重合并
'changelog-producer' = 'input', -- 接收 CDC 的完整变更日志
'bucket' = '4' -- 分桶优化
);
二、Append-Only 表
1. 特点
- 无主键:仅支持追加写入,无更新或删除操作。
- 无合并逻辑:每条记录独立存储,天然保留全量明细数据。
- 无变更日志:数据按写入顺序追加,无
-U
/-D
事件。
2. 典型配置
CREATE TABLE logs (
log_id STRING,
message STRING,
timestamp TIMESTAMP
) WITH (
'bucket' = '4', -- 分桶优化
'bucket-key' = 'log_id' -- 分桶键(非主键)
);
三、核心对比与关系总结
维度 | 主键表 | Append-Only 表 |
---|---|---|
主键 | 必须定义,支持更新/删除 | 无主键,仅追加写入 |
数据合并 | 由 merge-engine 控制 |
无合并逻辑 |
变更日志 | 由 changelog-producer 生成 |
不支持变更日志 |
适用场景 | CDC 同步、实时更新、状态管理 | 日志存储、无更新需求的明细数据 |
流式消费 | 支持(依赖完整 Changelog) | 仅支持追加流(无 -U /-D 事件) |
四、配置组合与典型场景
1. 主键表 + deduplicate
+ input
- 场景:MySQL CDC 同步,需保留完整变更历史。
- 行为:
- CDC 的
DELETE
事件直接写入 Paimon。 - 流式读取时获取
+I
/-U
/+U
/-D
事件。
- CDC 的
2. 主键表 + partial-update
+ lookup
- 场景:多流合并构建宽表(如用户画像)。
- 行为:
- 不同流更新不同字段,通过
sequence-group
解决乱序。 - Compaction 时生成
-U
事件,确保变更日志完整。
- 不同流更新不同字段,通过
3. Append-Only 表
- 场景:日志数据存储,无需更新或删除。
- 行为:
- 直接追加数据,无合并或变更日志。
- 通过时间旅行查询历史快照。
五、注意事项
- 主键表必须包含分区键:所有分区键字段需包含在主键中(如
PRIMARY KEY (id, dt)
,分区键为dt
)。 - 流批一致性:主键表的
changelog-producer
需与下游引擎兼容(如 Flink 需启用ChangelogNormalize
)。 - 存储优化:
- 主键表:通过
bucket
和compaction.async.enabled
优化写入性能。 - Append-Only 表:通过
snapshot.time-retained
管理历史数据。
- 主键表:通过
六、总结
- 主键表:面向 动态数据(更新/删除),依赖
merge-engine
和changelog-producer
实现高效合并与流式同步。 - Append-Only 表:面向 静态数据(仅追加),无需复杂配置,适合海量明细存储。
- 选型原则:
- 需要更新或删除 → 主键表 + 合理配置
merge-engine
和changelog-producer
。 - 纯追加无变更 → Append-Only 表 + 分区/分桶优化。
- 需要更新或删除 → 主键表 + 合理配置