你在两家公司的客户表里看到“张伟”和“张 卫”:电话少一位,地址一个新、一个旧。它们是同一个人吗?如果要求每个字段完全相同,就会漏掉大量真实重复;如果把所有记录两两比较,十亿行又会产生无法承受的计算量。Splink 5 要解决的,正是这种大规模“认人”问题。
Splink 是一款免费开源的记录链接(record linkage)和去重工具。记录链接是在不同数据集之间寻找同一对象,去重则是在一个数据集内合并重复项。两者都依赖概率记录链接:综合姓名、地址等字段的一致与冲突,估计两条记录指向同一实体的可能性,而不是只看它们是否完全相等。
这次发布及性能数字均来自 Splink 官方博客,尚无独立复测。官方称其累计下载量超过 2200 万次,并广泛用于政府、学术界和私营部门,但没有公布统计口径或独立采用数据。
十亿行,关键不是全都互相比
十亿条记录若逐对比较,规模会迅速失控。实际系统通常先做“阻塞”(blocking):用较宽松的规则筛出可能相关的候选对,再进行精细评分。可以把它理解为先从整座城市缩小到几个街区,然后才逐户核对。
Splink 5 没有更换统计模型。官方表示,同一设置下,Splink 4 训练的模型会在新版产生相同结果;模型的序列化格式也未改变,原有 .json 模型可以直接加载。这次升级的重点不是改变“如何判断两条记录是否匹配”,而是重新安排大任务怎样执行。
新版 predict() 可以把预测工作切成多个分块。这样既能先算出部分结果,也能报告进度和预计完成时间。使用 DuckDB 时,大任务还可以拆到多台机器上运行。不过,官方只说可以拆分,并未证明它已经是一套成熟的自动分布式执行系统。
官方测试中,尚未发布的 DuckDB 2.0 在一台 192 vCPU 的 EC2 实例上,对 10 亿行记录生成的 100 亿次候选比较执行 predict(),耗时 8.5 分钟。这个数字说明预测阶段已经能触及十亿行规模,但不能理解为“任何电脑都能在十分钟内完成十亿行实体匹配”:它不代表端到端流程,也没有给出实例型号、成本、内存、数据分布和 Splink 4 对照结果。
训练也开始学会适可而止
新版也减少了训练阶段不必要的工作。estimate_u_using_random_sampling() 会分块抽样;当各类比较已经积累足够观测,就提前停止。EM——一种反复估计隐藏匹配关系与模型参数的训练方法——现在可用 max_pairs 限制候选对数量。估计两条随机记录恰好匹配的概率时,也可以通过 record_sample_proportion 只抽取部分记录。
阻塞规则分析同样默认从样本估算比较次数,方便先判断某条规则会制造多大的任务;需要精确计数时,可把 record_sample_proportion 设为 1.0。这些变化共同指向一个朴素思路:面对超大数据,先用足够可靠的估算决定怎么跑,不必每一步都扫描全量数据。
它为何不只是一次跑分
据英国司法部资料,Splink 最初源于一个现实身份难题:法院、监狱和缓刑系统建于不同年代,没有通用人员编号,研究者难以追踪同一个人在司法体系中的经历。团队发现现成工具难以承受数百万条政府记录,才把相关计算交给 Apache Spark 分散处理。它最初服务的不是“十亿行纪录”,而是判断政策干预是否有效、哪些人反复进入司法系统。
Splink 5 还把必需依赖缩减到 sqlglot、duckdb 和 pyarrow;Pandas、NumPy、Altair 与 Jinja2 改为可选项。依赖更少通常意味着安装和嵌入生产系统更省事,但官方所称“更安全”仍属于项目方判断,材料没有提供供应链风险的量化比较。
迁移也不是完全无感。Splink 4 脚本需要少量语法调整,不过训练、预测、聚类的核心流程保持不变。对已经积累模型和流程的团队来说,这种“计算方式大改、统计结果不改”,可能比换一个更复杂的新模型更有实际价值。
局限与未知
- 8.5 分钟是特定高配云环境中的
predict()单阶段成绩,不等于完整实体匹配耗时,也不能外推到普通硬件和所有数据。 - 官方没有给出 Splink 4 对照、资源成本、峰值内存及完整复现实验条件,“更快、更易用于生产”等说法仍待独立验证。
- 官方称新版更清晰地支持增量链接,即只处理新记录产生的比较;现有材料不足以确认其具体机制和性能边界。