我有两个版本(旧/新)的数据库表大约100,000,000条记录。他们在文件:Mapreduce表Diff
trx-old
trx-new
结构为:
id date amount memo
1 5/1 100 slacks
2 5/1 50 wine
id是简单的主键,其他领域都非关键。我想生成三个文件:
trx-removed (ids of records present in trx-old but not in trx-new)
trx-added (records from trx-new whose ids are not present in trx-old)
trx-changed (records from trx-new whose non-key values have changed since trx-old)
我需要在一个短的批处理窗口中每天都执行此操作。实际上,我需要为多个表和跨多个模式执行此操作(为每个模式生成三个文件),所以实际应用程序会涉及更多一点。但我认为这个例子抓住了问题的症结所在。
这感觉就像是mapreduce的一个明显的应用。从未写过mapreduce应用程序我的问题是:
- 是否有一些EMR应用程序已经这样做?
- 有没有一个明显的猪或可能是级联解决方案?
- 是否还有其他一些开源示例与此非常接近?
PS我看到了diff between tables的问题,但在那里的解决方案看起来不可扩展。
PPS这里是一个小的Ruby玩具演示算法:Ruby dbdiff
2.是的,猪解决方案至少为添加和删除的部分是明显的'LEFT OUTER JOIN'和'FILTER'基于加入的列是否为'null'。至于“改变”,我最好的猜测是一个内部的'JOIN'和根据字段是否不同的过滤器。 – TC1 2013-05-05 20:07:41