如何对两个大型数据源 (csv) 进行比较

Posted

技术标签:

【中文标题】如何对两个大型数据源 (csv) 进行比较【英文标题】:How to do a diff on two large data sources (csv) 【发布时间】:2017-11-26 02:28:35 【问题描述】:

我有一张包含数十亿条记录的表。我想看看这张表在过去一个月里发生了怎样的变化。我在 1 月 1 日和 1 月 31 日有一个表导出的 CSV 文件。有什么方法可以很好地了解该文件在这段时间内的变化情况。例如:

pk        old.name       old.age    new.name        new.age          diff (inferred)
1         david          18         david           18               UNCHANGED
2         charles        17         NULL            NULL             REMOVED
3         bob            19         bob             20               CHANGED
4001      NULL           NULL       bracey          14               ADDED

通常我只会使用 unix diff 命令,但单个计算机/服务器无法处理此问题。一种想法是将两个表保存到 BigQuery 并执行完整的外部联接,例如:https://***.com/a/19594004/651174。看看记录是如何变化的?

这更像是一个概念性问题,关于我将如何使用两个 csv 文件执行上述操作,每个文件都有数十亿条记录。我的目标是优化速度,因为这将是一种常见的操作。你有什么建议?

【问题讨论】:

你可能想看看亚马逊红移光谱aws.amazon.com/redshift/spectrum 或亚马逊雅典娜aws.amazon.com/athena 这些听起来不是很好的建议。在 Athena 中加入大型 CSV 文件听起来像是极慢查询的秘诀。大卫,到目前为止你有什么尝试?您是否尝试过使用外部联接? This is more a conceptual question - 从概念上讲 - 只需将 csv 文件加载到 GBQ 并执行 FULL OUTER JOIN @JonScott 使用频谱或雅典娜有什么区别?如果数据已经在 s3 中,这听起来比 BQ 更简单,因为在这种大小的文件上传输数据本身需要一个小时左右。 我宁愿只迭代 ***,因为我有很多义务,抱歉。听起来像将文件加载到 BigQuery 并使用完整的外部连接就足够了。 【参考方案1】:

有比较数据库表的工具,例如pt-table-sync。见https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-sync.html

您可以使用带有选项 --dry-run --print 的 pt-table-sync 来打印有多少不同,而不是对数据进行任何更改。

此工具的优点是它按较小的块比较数据,而不是尝试一次性读取整个表。对于有数十亿行的表,这很重要。

【讨论】:

以上是关于如何对两个大型数据源 (csv) 进行比较的主要内容,如果未能解决你的问题,请参考以下文章

对存储在 AWS S3 中的大型 CSV 文件进行数据屏蔽

大型数据集,不同数据库之间的数据比较不兼容

如何使用 python 对 CSV 文件的多列进行排序?

确定传入的 CSV 数据和现有的大型数据集 Mongo 集合之间的差异

如何使用 Pentaho 验证一个 csv 数据与另一个 csv 文件的比较?

为啥我的 CSV 比具有相同数据的 JSON 文件大?