检索和比较具有多列的大型数据集

本文关键字:大型 数据集 比较 检索 | 更新日期: 2023-09-27 18:26:44

要求:我有多个数据库(Oracle/SQL Server)等。从数据库中,我需要将大量数据放入c#程序中,并将数据与其他数据库进行比较。数据集中的每个数据文件都有一个密钥(不是100%唯一的,也可能有重复项),使用该密钥我可以比较其他数据集文件/数据库。

每个数据库将返回大约150万行。我有5个不同的数据库,我将从中获取数据。即750万行将加载到我的程序中。

  1. 将数据加载到程序中的最佳方式是什么(目前,在数据库端,每个SQL需要5分钟)。加载到CSV,然后在C#中读取?还有其他想法吗?

  2. 我计划将数据加载到c#中的HashSet中,这是个好选择吗?

DB 1:
Account   Amount
1234  1
9999  66
DB 2:
Account   Amount
1234  2
9999  66
DB 3:
Account   Amount
1234  1
9999  66
DB 4:
Account   Amount
1234  10
9999  66
After comparing the output looks like
Account   DB1 Amt DB1 Amt DB3 Amt DB4 Amt Match?
1234  1   2   1   10  No
9999  66  66  66  66  Yes

检索和比较具有多列的大型数据集

恕我直言,这不是一个大问题。这是一个中等规模的问题,您必须处理7.5兆行。在您的示例中,这些行似乎相对较短。如果你可以访问一台RAM超过2GB的计算机,你可能可以很容易地在RAM中完成这项工作。一台典型的2011年代的笔记本电脑就可以做到这一点。几乎任何一台Winx64笔记本电脑都可以在RAM中完成。

您询问是否应该直接从数据库系统或CSV中提取数据。如果您计划在生产中使用此系统,您应该坚持使用数据库系统。这样就避免了错误地处理过时数据的可能性。

从您的问题来看,您的各种系统中的Account值似乎完全匹配,而没有太多关于模糊匹配的麻烦。也就是说,一个账户在几个数据库中似乎被称为"1234",而在其中一个数据库中不是"1234"、在另一个数据库为"1234-001",在第三个数据库中是"A1234-2014"。这是个好消息。这意味着您可以使用诸如HashSets之类的东西在内存中处理它们。

您可能应该将系统设置为可以处理所有数据或Account值的任意子集。例如,您可以允许将子集指定为"1000"-"1999"。这对测试来说非常方便,因为你只需要几千个账户就可以进行短期运行。这应该意味着您可以使用短时间运行的子集查询使一切正常工作。当你对一切顺利感到满意时,你可以开始生产,然后回家过夜。

请注意,如果这是一次性的工作,您也可以在您的个人计算机上安装一些DBMS(MySQL或PostgreSQL将是很好的开源选择),将各种数据库系统的各种摘录加载到其中的表中,并在它们上执行JOIN。

最后,如果你继承了未知质量的数据,谷歌会让你下载一个非常有用的数据检查和清理工具,名为OpenRefine。