先给结论:不要直接把旧输入规范里的字段名、分隔符和层级原样搬过去,也不要因为一次报错就推翻整份规范。正确做法是先把“对象格式变化”拆成可验证的三层——字段语义、值域表达、批量边界——再决定哪些保留、哪些改写、哪些退出。只有确认变化发生在哪一层,输入规范才改得准。
对象格式变化通常有三种来源,处理方式完全不同。
判断方法很直接:拿一条旧数据,按旧规范填进去。如果单条能通过、批量失败,问题在批量边界;如果单条就语义不对,问题在字段语义;如果单条能过但结果不是你预期的值,问题在值域表达。这个动作的结果决定了下一步是改字段映射、改校验脚本,还是改批量拼接逻辑。
保留适用于字段语义和值域都没变、只是外部格式包装变了的情况。比如同样一个标识,旧格式用空格分隔,新格式用固定长度截取。此时输入规范里的字段定义不用动,只需要在入口处加一层转换。前提是你已经验证过转换后的值与旧值逐条一致。
改写适用于字段语义扩展或值域收窄。典型信号是:旧规范允许的某些值,在新格式下无法表达,或者表达后会被解释成另一个含义。改写时要同步更新三处——字段说明、示例值、校验规则。只改示例不改校验,等于没改。
退出适用于旧字段在新对象格式里已经没有对应位置,且强行映射会产生歧义。退出的前提是确认该字段承载的信息不再被需要,或者已由其他字段覆盖。如果只是暂时找不到映射,应该先标记为待定,而不是直接删除,否则后续补数据时会出现无法对齐的缺口。
假设旧输入规范里“类别”字段是自由文本,允许填“主推”“常规”“测试”等任意词;新对象格式要求该字段只能取固定几个枚举值,且大小写敏感。此时按旧规范填“主推”可能被拒绝,也可能被静默丢弃。
处理顺序是:先列出旧数据里实际出现过的所有取值,再与新枚举做一对一映射;无法映射的值单独列出,决定是归入某个默认枚举还是标记为异常。然后更新输入规范,把“类别”从自由文本改为枚举,并在校验规则里写明大小写要求。最后用一批旧数据试跑,统计被拒绝或映射到默认值的比例。如果比例集中在少数几个旧值上,说明映射表需要补;如果比例分散,说明旧规范里这个字段本身就没有稳定取值,应该考虑先清洗数据再改规范。
这个例子里,动作是“先统计旧取值分布再改规范”,结果是你能区分“映射缺失”和“数据本身混乱”,下一步该补映射还是该做数据清洗就清楚了。
不要只看“没有报错”。没有报错可能只是校验被放宽了,也可能只是错误被吞掉了。更可靠的信号有三个:
如果请求量或抓取量突然归零,不能单独作为判断依据。归零还可能来自入口未触发、任务未调度、对象被上游过滤等原因。需要结合拒绝日志和条数核对一起看,才能确定是规范改错了还是流程没跑起来。
不同工具对对象格式的支持范围、校验严格程度和批量限制并不相同,而且可能随版本调整。如果你用的具体工具对枚举大小写、空值、多值分隔有特殊要求,应以该工具当前文档或实际试跑结果为准,不要沿用旧教程里的描述。在输入规范里,把这些工具相关的约束单独成节,并注明核对时间,这样格式再次变化时,你能快速定位到需要复查的部分。
改输入规范的本质不是追着格式跑,而是让字段语义、值域表达和批量边界这三层各自有明确的验证方式。先定位变化层级,再决定保留、改写还是退出,最后用可解释的差异和明确的拒绝来确认改对了。