先给结论:对象格式变化后,不要直接把新格式塞进旧输入规范里跑一遍看结果。正确做法是先判断变化属于哪一种——是分隔符、编码、字段顺序这类表层变化,还是对象粒度、层级关系、来源结构这类深层变化。表层变化通常只需改写输入规范中的清洗与映射规则;深层变化则要重新定义“一个查询对象”是什么,旧规范往往要部分保留、部分退出。判断依据不是跑通没跑通,而是新旧对象能否落到同一个可比较的语义单元上。
把输入规范拆成三层看,决策会清楚很多:
一个可操作的判断动作:拿变化前后的各三条样本,手工标出“哪一段是对象标识、哪一段是属性、哪一段是关系”。如果三段边界一致,只是写法不同,属于字符层;如果边界本身变了,就进入结构层或来源层,旧规范不能整体沿用。
当对象标识的生成逻辑没变,只是分隔符或编码变了,保留旧规范的主体、只替换清洗规则是合理的。例如原来用竖线分隔字段,现在改用制表符,那么切分函数换掉即可,字段映射和去重逻辑不动。这种情况下动作是:先备份旧规范,再只改切分与转义两处,然后用同一批历史对象回跑,确认对象数量与标识集合没有意外增减。如果数量对得上,再进入下一步;如果对不上,说明变化不止于字符层,应退回重新分层。
出现以下任一情况,说明必须改写而不是微调:同一字段在新格式里承载了两种含义;原来一个对象现在被拆成多行;原来多行现在被合并成一行。此时要重新写映射表,并为新旧对象建立对照关系。改写后的验证动作是抽样比对:随机取若干对象,检查其属性在新规范下是否仍能还原到旧规范下的同一语义。还原不了,就不是格式问题,而是对象定义变了。
如果新格式里已经不存在稳定的对象标识,或者对象之间的关系无法从数据本身推导,只能靠外部信息补全,那么继续维护旧输入规范的成本会持续上升。此时更合理的选择是退出这条输入链路,改为按新格式重新定义对象,而不是在旧规范上不断打补丁。退出的判断依据是:连续多次改写后,仍无法让新旧对象落在同一比较口径上。
假设某业务原来输入的是“词A|词B|词C”这种单层列表,每个词是一个对象。后来来源改成带层级的导出,形如“主题>子题>词”。此时若仍按竖线切分,会把层级关系压平,导致同一子题下的词被误判为并列对象。正确动作是先把分隔符映射为层级标记,再决定比较单元是“主题”还是“子题”。如果业务问题本身关心的是子题,那么对象粒度应定在子题层,旧规范中的去重与统计逻辑需要整体上移一层。这个例子的数字和结构均为假设,仅用于说明分层判断的方法。
不要只看“有没有报错”。更有区分度的证据包括:对象标识集合是否稳定、属性缺失是否集中在某一类对象、新旧规范下同一批对象的比较结果是否一致。如果对象数量变化但标识集合稳定,可能只是多值展开,属于正常;如果标识集合本身漂移,说明对象定义已经改变,下一步应重做对象模型,而不是继续调输入规范。请求量或抓取量归零也不能单独证明处理正确,它同样可能来自来源暂停、权限变化或调度异常,需要结合来源侧信息交叉判断。
把以上判断落成顺序:先分层,再决定保留、改写或退出,最后用对象标识与语义还原两类证据确认是否进入下一步。这样处理格式变化,比反复试跑更省返工。