4. 去重核心概念

在Market Data多源接入场景中,“去重”并不是一个简单的DISTINCT操作,而是一套围绕业务语义建立的数据治理规则。行情数据来自交易所、数据供应商、内部缓存、第三方聚合源,同一支股票、同一时刻、同一字段可能以不同精度、不同延迟、不同标识反复到达。若不能先定义“什么算重复”,后续的主键设计、合并策略和存储模型都会失去依据。

一、重复的定义:从物理重复到业务重复

重复在工程上至少分为三个层次。第一层是物理重复:两条记录的所有字段完全一致,通常由重试、回补、消息重投造成。第二层是逻辑重复:记录标识不同,但描述的是同一业务事实,例如同一笔成交被两个源用不同trade_id上报。第三层是语义重复:字段值存在细微差异,但业务上应视为同一事件,例如价格相同、时间戳相差几毫秒、成交量因四舍五入略有不同。

因此,去重前必须回答三个问题:谁和谁比(比较范围)、比什么(比较字段)、谁保留(胜出规则)。这三个问题分别对应去重键、相似度判定和优先级策略,也是后续主键设计的输入。

核心原则:去重不是删除数据,而是把“多源对同一事实的多次表达”收敛为一条可信记录,并保留必要的来源与版本信息用于审计。

二、精确去重与模糊去重

精确去重依赖确定性键值完全匹配,例如以(symbol, exchange, trade_time, trade_id)作为唯一键,重复记录直接丢弃或覆盖。它实现简单、性能高、结果可解释,适合交易所原始逐笔、订单簿快照等结构化程度高的数据。

模糊去重则允许键值或字段存在容差,常见手段包括:时间窗口对齐、价格/数量容差比较、字符串相似度、以及基于业务规则的等价类合并。它适合处理多源行情中时间戳偏移、代码映射不一致、精度差异等问题。模糊去重必须设置阈值与置信度,否则容易把真实的两笔相近成交误判为一笔。

维度精确去重模糊去重
判定依据键值完全相等键值/字段在容差内相似
典型场景同源重投、交易所逐笔多源行情、跨市场映射
性能高,可哈希/排序较低,需窗口与相似度计算
风险漏判逻辑重复误合并真实独立事件
可解释性强依赖规则与阈值

三、去重粒度:决定主键与合并边界

去重粒度回答“以什么为单位判断重复”。行情数据常见粒度包括:逐笔级(单笔成交/委托)、快照级(某时刻订单簿切片)、K线级(分钟/日线)、标的级(证券静态信息)。粒度越细,主键字段越多,去重成本越高,但保留的信息越完整;粒度越粗,合并越激进,越容易丢失微观结构信息。

粒度选择必须与业务影响对齐。例如做实时风控时,逐笔级去重能避免重复成交导致持仓虚增;做量化回测时,快照级去重可减少冗余切片,但若把不同毫秒的快照强行合并,会破坏盘口演化路径;做行情展示时,K线级去重足以支撑图表,却无法还原逐笔明细。

多源行情去重:粒度—主键—业务影响 交易所源A 逐笔 / 快照 供应商源B 聚合 / 延迟 内部缓存源C 重投 / 回补 去重判定层 精确键匹配 时间窗口 + 容差 来源优先级 逐笔级主键 symbol+time+trade_id 快照级主键 symbol+snap_time 业务影响:风控防虚增 · 回测保路径 · 展示可聚合 粒度越细 → 主键越复杂 → 去重成本越高 → 信息保留越完整

四、案例与场景:同一笔成交的多源表达

假设某股票在交易所源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的多源去重才能既保证数据可信,又支撑实时性与可审计性。