比较2个大型数据集的最佳技术

时间:2019-01-04 13:54:36

标签: database performance comparison

问题

每天,我们都会从后台应用程序中接收一组新的数据文件。该应用程序无法产生增量变更集,因此它所能做的就是将其转储到大文件中。

当前每天早晨,我们删除旧的MySQL表并将数据加载到uor数据库中。

我们遇到的问题之一是,我们无法对数据中的特定更改采取行动,而且我们正在使用CQRS,如果有了增量列表,这将带来很多好处。

  • 文件格式当前为CSV
  • 每个文件的数据大小最大为10GB
  • 每个文件的行数最多为4000万
  • 大约30个数据文件
  • 平均每天少于1%的行被更改
  • 大多数文件没有主键或组合的主键。对于许多人来说,整行是使它们唯一的唯一原因。
  • 数据顺序不固定。行可能会切换位置

期望的情况

当我们收到新数据时,我们将计算出差异,并针对每一次更改(如果存在rowidentifier),添加或删除的行将消息推送到Kafka。

技术

  • 我们使用AWS,并且能够使用AWS提供的所有技术
  • 我们不仅限于一定数量的硬件。我们可以在AWS中启动一些新服务器
  • 成本只是一个非常有限的因素。我们的预算很大,拥有一套增量预算的能力为我们提供了很多价值。
  • 我们有一个正在运行的Kubernetes集群

问题

所以主要问题是,比较这两个大文件并创建增量集的最佳方法是什么?我们需要它要快,最好在一个小时内或接近它。

是否存在本身具有此功能的数据库类型?是否有可以为我们做到这一点的技术?

1 个答案:

答案 0 :(得分:1)

“ ...数据顺序不固定。行可能会切换位置...”这使操作变得困难。如果行没有更改,则git diff或文本文件比较工具将起作用。

Spitballing在这里,但是:

  1. 为每一行创建一个SHA哈希
  2. 使用哈希作为唯一ID
  3. 将每个UNIQUE哈希和相关数据存储到数据库表中。
  4. 后处理文件,将表转储到文本文件(CSV / SQL / etc)
  5. 将文件更改为源代码控制
  6. 收到新数据集时,请检查哈希是否存在
    • 如果否:将哈希值附加到表的末尾
    • 如果是:忽略
  7. 将表转储到文本文件(CSV / SQL / etc)
  8. 'git diff'致力于查看更改集。

可能可以通过AWS Glue ...

奖金: 为了更轻松地创建位置,后台应用可以上传文件并创建cron以在给定时间处理报告

此过程是典型的ETL (Extract-Transform-Load)任务。您正在从一种源/格式中提取数据,进行更改,然后将其加载/插入到另一种源/格式中。

让我知道这是否有帮助。