4. 去重核心概念
在Market Data多源接入场景中,“去重”并不是一个简单的DISTINCT操作,而是一套围绕业务语义建立的数据治理规则。行情数据来自交易所、数据供应商、内部缓存、第三方聚合源,同一支股票、同一时刻、同一字段可能以不同精度、不同延迟、不同标识反复到达。若不能先定义“什么算重复”,后续的主键设计、合并策略和存储模型都会失去依据。
一、重复的定义:从物理重复到业务重复
重复在工程上至少分为三个层次。第一层是物理重复:两条记录的所有字段完全一致,通常由重试、回补、消息重投造成。第二层是逻辑重复:记录标识不同,但描述的是同一业务事实,例如同一笔成交被两个源用不同trade_id上报。第三层是语义重复:字段值存在细微差异,但业务上应视为同一事件,例如价格相同、时间戳相差几毫秒、成交量因四舍五入略有不同。
因此,去重前必须回答三个问题:谁和谁比(比较范围)、比什么(比较字段)、谁保留(胜出规则)。这三个问题分别对应去重键、相似度判定和优先级策略,也是后续主键设计的输入。
核心原则:去重不是删除数据,而是把“多源对同一事实的多次表达”收敛为一条可信记录,并保留必要的来源与版本信息用于审计。
二、精确去重与模糊去重
精确去重依赖确定性键值完全匹配,例如以(symbol, exchange, trade_time, trade_id)作为唯一键,重复记录直接丢弃或覆盖。它实现简单、性能高、结果可解释,适合交易所原始逐笔、订单簿快照等结构化程度高的数据。
模糊去重则允许键值或字段存在容差,常见手段包括:时间窗口对齐、价格/数量容差比较、字符串相似度、以及基于业务规则的等价类合并。它适合处理多源行情中时间戳偏移、代码映射不一致、精度差异等问题。模糊去重必须设置阈值与置信度,否则容易把真实的两笔相近成交误判为一笔。
| 维度 | 精确去重 | 模糊去重 |
|---|---|---|
| 判定依据 | 键值完全相等 | 键值/字段在容差内相似 |
| 典型场景 | 同源重投、交易所逐笔 | 多源行情、跨市场映射 |
| 性能 | 高,可哈希/排序 | 较低,需窗口与相似度计算 |
| 风险 | 漏判逻辑重复 | 误合并真实独立事件 |
| 可解释性 | 强 | 依赖规则与阈值 |
三、去重粒度:决定主键与合并边界
去重粒度回答“以什么为单位判断重复”。行情数据常见粒度包括:逐笔级(单笔成交/委托)、快照级(某时刻订单簿切片)、K线级(分钟/日线)、标的级(证券静态信息)。粒度越细,主键字段越多,去重成本越高,但保留的信息越完整;粒度越粗,合并越激进,越容易丢失微观结构信息。
粒度选择必须与业务影响对齐。例如做实时风控时,逐笔级去重能避免重复成交导致持仓虚增;做量化回测时,快照级去重可减少冗余切片,但若把不同毫秒的快照强行合并,会破坏盘口演化路径;做行情展示时,K线级去重足以支撑图表,却无法还原逐笔明细。
四、案例与场景:同一笔成交的多源表达
假设某股票在交易所源A上报为trade_id=A-1001, price=10.25, qty=300, ts=10:00:00.123;供应商源B上报为trade_id=B-7788, price=10.25, qty=300, ts=10:00:00.128。若按精确键去重,两者不会命中;若按时间窗口±10ms + 价格数量相等做模糊去重,则可判定为同一笔成交,并按来源优先级保留源A。
-- 精确去重示例:以交易所原始键为准
SELECT *
FROM market_trade
QUALIFY ROW_NUMBER() OVER (
PARTITION BY symbol, exchange, trade_time, trade_id
ORDER BY ingest_time DESC
) = 1;
-- 模糊去重示例:时间窗口内按价格数量聚合
SELECT symbol,
MIN(trade_time) AS trade_time,
price,
SUM(qty) AS qty,
ARRAY_AGG(source) AS sources
FROM market_trade
GROUP BY symbol, price, qty,
FLOOR(UNIX_MILLIS(trade_time) / 10);
实践建议:先做精确去重消除同源重投,再用模糊去重处理跨源逻辑重复。模糊规则应可配置、可回放,并记录被合并记录的来源,便于事后审计与规则调优。
五、常见误区与复盘
- 误区一:把去重等同于删数据。直接删除会丢失来源与版本,无法追溯。应保留来源标记、摄入时间和合并批次。
- 误区二:模糊阈值拍脑袋。时间窗口过大或价格容差过宽,会把真实的两笔相近成交合并,导致成交量虚减。
- 误区三:粒度与主键不匹配。用逐笔主键存快照,或反之,会造成大量伪重复或漏判。
- 误区四:忽略业务优先级。多源冲突时若无明确胜出规则,同一主键可能在不同批次保留不同值,破坏一致性。
复盘要点:去重规则上线前,必须用历史数据做回放验证,统计合并率、误合并率和漏合并率。任何模糊规则都应设置可观测指标,并在主键设计时预留来源与版本字段,避免后期无法回溯。
综上,重复定义决定了去重的边界,精确与模糊去重决定了实现手段,去重粒度决定了主键结构与合并范围,而业务影响则反向约束前三者的取舍。只有把四者放在同一张设计图上,Market Data的多源去重才能既保证数据可信,又支撑实时性与可审计性。