格式变化本身不决定要不要改规范,决定因素是旧规范是否还能把“对象身份、字段含义、缺失状态”这三件事表达清楚。能表达,就只做兼容层;不能表达,就必须先改规范再谈批量导入,否则后续清洗和比对都会失去依据。
把新旧格式各取一条最小样本并排看,只问三个问题:同一个对象用什么字段唯一标识;旧字段是否都能在新格式里找到对应位置;新格式是否引入了旧规范无法表达的新状态。三问都能答“是”,属于可映射变化;只要有一问答“否”,就属于不可映射变化。
可映射变化的典型信号是字段改名、顺序调整、分隔符从逗号换成制表符、层级从平铺改成一层嵌套。不可映射变化的典型信号是原来一个字段拆成两个、原来没有的状态位现在必须填写、唯一标识从域名换成另一套编码。前者改映射表即可,后者改的是规范本身。
选择依据:如果下游还要把处理结果与历史数据合并,标识字段是否稳定比字段名是否好看重要得多。标识一变,历史数据就无法与新增数据对齐,这时即使其余字段完全兼容,也应按不可映射处理。
当新旧字段能一一对应,且唯一标识未变,最小动作是维护一张映射表:左列写旧字段名,右列写新字段名,第三列写转换规则,例如去空格、统一大小写、日期转成同一格式。把这张表作为输入前置步骤,而不是直接改规范正文。
动作与结果的关系很直接:映射表一旦固定,后续每次拿到新格式文件都先跑一遍转换,再进入原有校验流程。结果是历史校验规则可以原样复用,你也能从转换日志里看出哪些字段经常需要修补,这些修补频率高的字段就是下一轮真正需要改规范的地方。
这个条件下不能推出的结论是“格式已经稳定”。字段可映射只说明这一次能对上,不说明对方以后不再增删字段。因此映射表要带一个复查点:每次数据量或来源发生明显变化时重看一次,而不是设成永久规则。
适用条件要写清:映射表只处理结构差异,不负责修正语义。如果新格式里“状态”字段的取值集合与旧规范不同,仅靠改名和去空格无法解决,那已经越过了本条边界。
当唯一标识变化,或新格式引入了旧规范表达不了的状态,正确顺序是先改规范、再改输入。改规范时至少明确三件事:新的唯一标识是什么、缺失值用什么占位、非法值在进入处理流程前被拒绝还是被标记。
一个假设例子说明比较方法:假设旧输入以域名作为唯一标识,新输入改为以另一套内部编码标识,且部分记录没有编码。若直接沿用旧规范,缺失编码的记录会被当成重复对象或被静默丢弃,两种结果都会让后续统计失真。此时规范里应写明:无编码记录单独进入待确认队列,不参与合并,也不计入有效对象数。这样做的结果是有效对象数可能短期下降,但下降原因可解释,而不是把两类问题混在一起。
实施动作:先在一个小批量样本上按新规范跑通,记录被拒绝、被标记、被正常处理三类各占多少。若被拒绝比例高到影响正常交付,说明规范改得过严,需要放宽拒绝条件;若被标记比例高,说明缺失处理还不够明确。这个比例只用于定位规范问题,不能单独证明格式变化本身是好是坏。
拿不到全量数据、也没有修改上游格式的权限时,仍可执行的最小动作是:只取能拿到的字段,建立一份字段清单,标注每个字段是“必需且可得”“必需但缺失”“可选”。然后只对“必需且可得”的字段写校验规则,其余字段一律标记为未验证。
这样做的结果是你能得到一份可信度受限但边界清楚的处理结果,而不是一份看起来完整、实际混入猜测的结果。不能推出的结论是:字段缺失不影响结论。缺失字段如果恰好是判断对象是否重复、是否有效的关键字段,那么未验证部分就不能并入已验证部分一起汇总。
例外情况:如果缺失字段只用于展示、不参与筛选和合并,可以暂时跳过,但要在规范里注明该字段为展示用途、不参与逻辑判断,避免后来者误把它当成判断依据。
不要只看导入是否成功。更有区分度的信号有三组:被拒绝记录的类型是否集中;同一对象在前后两次处理中的标识是否一致;缺失值是否都落在预先声明的位置。三组信号都稳定,说明规范改动方向可用;只有导入成功而这三组混乱,说明问题被推迟到了下游。
同时要接受一个事实:请求量、抓取量或某类记录数归零,不能单独证明输入规范改对了。归零也可能是上游停止提供、筛选条件过严或权限范围缩小造成的。要区分这些解释,需要对照改动前后的字段清单和拒绝原因分布,而不是只看总量。
最后,规范里应保留一段变更记录:谁在什么条件下改了哪条规则、影响哪些字段、下次复查的触发条件是什么。这段记录不解决格式问题本身,但它让下一次格式变化时,你能判断该沿用映射还是直接改规范,而不必从零重新推一遍。