先给一个有条件的结论:如果格式变化只是字段名、分隔符或编码方式变了,而对象语义没变,那么输入规范应当先改“解析层”,保留原有的校验规则和字段映射;只有当对象本身的粒度或层级也变了,才需要重写校验规则和下游的核对清单。换句话说,判断依据不是新格式看起来多陌生,而是新旧对象能否一一对应。
把格式变化拆成两类,能避免把改输入规范做成一次全量返工。
2024-01-01 变成 20240101。这类变化影响的是解析和清洗。表示变化时,输入规范里应当新增一段格式声明,写明分隔符、编码、日期格式、空值写法,但不要动字段必填项和取值范围。对象变化时,必须重新定义主键。主键选错,后续所有核对都会出现“看起来对不上、其实对错对象”的情况。
多个角色对同一份输入有不同理解时,争论通常集中在“这条记录到底代表什么”。与其反复解释,不如把分歧写成一张核对表,让每个人对同一行数据给出判断。
这个动作的结果会直接决定下一步:如果差异只出现在日期和空值上,改解析说明即可;如果差异出现在“一行代表什么”上,就要先冻结对象定义,再谈格式。
假设原来输入是每行一个页面,字段为页面地址和标题。新格式每行变成页面地址、查询词、展示次数三项,同一个页面会出现多行。此时如果仍按页面地址去重,就会只保留其中一行,丢失其余查询词;如果按页面地址加查询词去重,页面层级的总量又不能简单相加。
可行的做法是:在输入规范里明确两级主键,页面级用页面地址,查询级用页面地址加查询词,并规定汇总时必须说明口径。这个假设说明的是比较方法,不是某个工具的真实行为。具体工具是否支持两级主键、是否允许同一字段重复出现,需要以该工具当前的文档或实际导入结果为准。
反例是:格式变化伴随了语义漂移,但表面上字段数量没变。例如同样叫“点击”,旧格式统计的是自然搜索结果点击,新格式统计的是包含广告在内的点击。这时字段名和结构都能对上,一一对应关系却已经断了。仅靠解析层调整无法发现这个问题,必须回到数据来源和统计口径重新确认。
另一个会让结论失效的情况是,输入规范被多个下游共用,而某个下游只依赖旧格式的隐式假设,比如默认按行号排序、默认没有重复行。格式一变,这些隐式假设不再成立,规范里必须把原来没写出来的约束显式写出来。
建议先冻结一段新旧格式并存的样本,按上面的核对表跑一遍,记录哪些字段能自动映射、哪些需要人工确认。然后只针对需要人工确认的字段修改输入规范,并在规范顶部注明适用条件和失效条件。改完后用同一段样本复跑,确认解析结果与冻结时的预期一致,再决定是否扩大到全量数据。这样做的结果是,格式变化带来的改动范围可以被限制在可解释的字段上,而不是整份规范推倒重来。