先给结论:不要直接把新格式的样本塞进旧输入规范跑全量。正确做法是先判断变化属于“同语义换壳”还是“语义结构改变”。前者只需在入口做适配映射,后者必须重写输入规范,并把校验、抽样和回滚一起改掉,否则个别样本能过、规模化后必然出现例外。
判断依据不是文件后缀,而是工具读取的字段层级和标识符是否还成立。可以拿同一批数据分别用旧规范和新格式各跑一次,比较三件事:字段映射是否一一对应、唯一标识是否稳定、缺失值是否落在同一位置。三项都一致,属于换壳;出现一项不一致,就按结构改变处理。
换壳的典型情况是分隔符、编码、列顺序变了,但字段含义和标识符没变。结构改变则是原本一个字段拆成多个、原本的页面标识换成另一套主键、或者层级从平铺变成嵌套。这两类不能用同一套输入规范,混用会让校验通过但结果错位。
如果确认是换壳,动作应该落在输入适配层,而不是重写规范。具体做法是保留原有字段定义,在读取阶段加一层映射:把新格式的列名、分隔符或编码转回规范要求的形态,再交给原有校验。
这样做的结果是可以继续复用已有的去重、过滤和导出逻辑,改动面小、回归成本低。但要注意边界:适配层只做形态转换,不做语义推断。一旦需要在适配层里写“如果A为空就取B”这类规则,说明已经越界到结构改变,应该停下来重新评估规范。
当标识符或字段层级变化时,继续打补丁会让规范越来越难维护。此时应重写输入规范,至少明确四件事:必填字段、唯一标识的生成规则、缺失值的表示方式、以及不合法输入的处理策略(拒绝还是标记)。
实施动作上,建议先在小样本上跑通,再逐步放大。判断是否放大的依据不是“样本都过了”,而是抽样检查中例外比例是否稳定在可接受范围。如果例外集中在某类记录上,说明规范还缺一条分支,不能靠放宽校验掩盖。
假设旧规范要求每行一个页面URL,新格式变成一行一个页面但附带多个变体URL。若直接把变体拼进同一字段,个别样本能解析,规模化后去重会把不同变体误判为同一页面。正确做法是在规范里新增“变体”维度并规定其与主URL的关系,而不是在旧字段里塞多个值。这个例子的数字只为说明比较方法,不代表任何真实数据。
这三件事里,回滚点最容易被忽略。没有回滚点,一旦规模化后出现例外,只能停跑排查,代价比提前保留旧路径高得多。
不要用“请求量归零”或“抓取量下降”来证明处理正确,这些现象还有别的合理解释,比如任务被中断、目标被过滤、或上游数据本身变少。更可靠的判断是:用同一批已知结果的样本重跑,看输出是否与预期一致;再对例外记录逐条归类,确认它们属于规范里已定义的分支,而不是未覆盖的边界。
如果例外无法归类,说明输入规范还没写完,此时应回到条件判断那一步,而不是继续调参数。只有例外能被现有规则解释,改动才算到位,下一步的规模化才有依据。