幂等写入是什么
幂等指同一个任务重跑多次,结果与只跑一次相同,这是调度敢放心重跑的前提。实现手段主要有两类:按分区先删后插(或整分区重写),让每次写入覆盖同一范围;以及用业务主键加更新时间的去重逻辑,让重复数据在写入前被合并。常见破坏幂等的写法有三种:INSERT INTO 无去重追加、把系统当前时间写进分区字段、依赖自增序列生成主键。
基本信息
| 判断标准 | 重跑两次,结果与只跑一次一致 |
|---|---|
| 常用手段 | 按分区先删后插、整分区重写 |
| 需要避免 | 无去重追加、依赖当前时间与自增序列 |
| 验证方法 | 同一分区连续执行两次,比对行数与指标 |
| 关联机制 | 调度自动重试、人工补数回刷 |
典型使用场景
- 调度失败自动重试:任务必须幂等,否则重试一次就多写一份数据
- 人工补数回刷历史分区:按分区覆盖写入,不影响其他日期
- 开发调试反复执行同一段 SQL:幂等写法可以放心重复运行
- 实时与批量都写同一张目标表:需要明确由谁负责最终结果
- 上下游重跑顺序不同的场景:分区级幂等能避免互相覆盖
幂等写法
幂等写法
-- 先清理目标分区再写入:重跑结果一致,可安全重试
ALTER TABLE dws_trade_store_day DROP IF EXISTS PARTITION (dt='2026-10-13');
INSERT INTO TABLE dws_trade_store_day PARTITION (dt='2026-10-13')
SELECT store_id, order_cnt, pay_amt FROM tmp_trade_store_day;
-- 等价写法:整分区重写,效果相同
INSERT OVERWRITE TABLE dws_trade_store_day PARTITION (dt='2026-10-13')
SELECT store_id, order_cnt, pay_amt FROM tmp_trade_store_day;写法是否幂等
| 写法 | 是否幂等 | 原因 |
|---|---|---|
| INSERT OVERWRITE ... PARTITION(dt=...) | 幂等 | 每次覆盖同一个分区 |
| 先 DROP PARTITION 再 INSERT | 幂等 | 清理范围与写入范围一致 |
| INSERT INTO 且无去重 | 不幂等 | 每次追加一批,重跑后翻倍 |
| 分区字段取 current_date() | 不幂等 | 跨天重跑会写进另一个分区 |
| 依赖自增 ID 或序列 | 不幂等 | 重跑生成新 ID,重复行无法合并 |
用系统当前时间做分区或版本字段会直接破坏幂等:重跑写进不同分区,产生重复数据或空分区。分区日期应由调度传入,或从业务数据里取,不要取自运行时刻。
验证幂等的办法很简单:在测试环境对同一分区连续执行两次,比对行数与关键指标是否一致。这个动作比事后靠对账发现问题便宜得多。