假设您有一个大型文本文件。每一行都包含一个电子邮件ID和其他一些信息(例如某个产品ID)。假设文件中有数百万行数据。您需要将这些数据加载到数据库中。那么,您如何高效地去重数据(即消除重复项)?
如果我是您,我仍然会在数据库上放置唯一约束条件...
你有两个选择:
用Java实现:你可以像组合一个HashSet
一样进行测试 - 对于每个输入项,如果它不存在于集合中,则添加一个电子邮件ID。
在数据库中实现:在表上放置唯一约束条件,这样重复项就不会被添加到表中。这样做的额外好处是,您可以重复此过程并从以前的运行中删除重复项。
看看Duke(https://github.com/larsga/Duke),这是一个用Java编写的快速去重和记录链接引擎。它使用Lucene进行索引并减少比较数量(以避免不可接受的笛卡尔乘积比较)。它支持最常见的算法(编辑距离、Jaro Winkler等),非常可扩展和可配置。
你能不能不用电子邮件和产品ID作为索引来建立表格?这样,通过索引进行读取时,重复的电子邮件或电子邮件+产品ID可以通过顺序读取并匹配前一个记录轻松地被识别出来。