如何对两个大型数据源 (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) 进行比较的主要内容,如果未能解决你的问题,请参考以下文章
确定传入的 CSV 数据和现有的大型数据集 Mongo 集合之间的差异