2011-10-01 23 views
1

我有一个包含超过3000万行的大型csv文件。我需要每天加载这个文件,并确定哪些行已经改变。不幸的是,没有独特的关键字段,但可以使用其中四个字段来使其具有独特性。一旦我确定了更改的行后,我将要导出数据。我曾尝试使用传统的SQL Server解决方案,但性能太慢,无法正常工作。因此我一直在研究Mongodb--它已经设法在大约20分钟内导入文件(这很好)。现在我没有使用Monogdb的经验,更重要的是要了解最佳实践。所以,我的想法如下:Mongodb导入和解密已更改行

  1. 作为一个 - 使用mongoimport将数据导入集合。

  2. 复制mongo生成的所有唯一ID并将它们放入单独的集合中。

  3. 使用upsert字段将新数据导入到现有集合中,这应该为每个新的和更改的行创建一个新的ID。

  4. 将“复制”与新集合进行比较,以列出所有更改的行。

  5. 导出已更改的数据。

这对我来说可行,但我希望有一个更好的方法来解决这个问题。

回答

0

使用unix sort和diff。

排序磁盘上

sort -o new_file.csv -t ',' big_file.csv 
sort -o old_file.csv -t ',' yesterday.csv 

diff new_file.csv old_file.csv 

命令的文件可能需要一些tweeking。

您也可以使用MySQL通过

http://dev.mysql.com/doc/refman/5.1/en/load-data.html(LOAD FILE)要导入的文件

,然后创建在4场键(或主键)。

那么昨天的文件加载到一个不同的表,然后用2个SQL语句比较的文件...

但是,DIFF将最好!

-daniel

+0

我一定会给diff命令一个去看看它如何执行,这可能正是我所期待的。非常感谢。 – frizzaUK