相交2个大数据集

时间:2013-12-05 02:00:45

标签: c# python database bigdata

我有一个巨大的(100Gb)csv文件,有几列,还有一个较小的(4Gb)csv,也有几列。两个数据集中的第一列具有相同的类别。我想创建第三个csv,其中包含大文件的记录,恰好在小csv中有匹配的第一列。在数据库术语中,它将是第一列上的简单连接。

我正在努力寻找最佳方法来解决这个问题。由于较小的数据集适合内存,我考虑将其加载到一种集合结构中,然后将大文件行读取到行并查询内存集,并在正文件上写入文件。

只是用SO术语来表达问题,是否有最佳方法来实现这一目标?

编辑:这是一次性操作。

注意:语言不相关,对列,面向行的数据库,python等的建议开放......

2 个答案:

答案 0 :(得分:1)

这样的东西
import csv

def main():
    with open('smallfile.csv', 'rb') as inf:
        in_csv = csv.reader(inf)
        categories = set(row[0] for row in in_csv)

    with open('bigfile.csv', 'rb') as inf, open('newfile.csv', 'wb') as outf:
        in_csv  = csv.reader(inf)
        out_csv = csv.writer(outf)
        out_csv.writerows(row for row in in_csv if row[0] in categories)

if __name__=="__main__":
    main()

我认为你的意思是100千兆字节,而不是100吉比特;大多数现代硬盘驱动器最高可达100 MB / s,因此预计只需16分钟即可读取磁盘上的数据。

答案 1 :(得分:0)

如果你只是这样做一次,你的方法就足够了。我要做的唯一改进是以块的形式而不是逐行读取大文件。这样你就不必那么多地点击文件系统了。你想让这些块尽可能大,同时还能适应内存。

如果您需要多次执行此操作,请考虑将数据推送到某个数据库。您可以插入大文件中的所有数据,然后使用第二个较小的文件“更新”该数据,以获得包含所有数据的一个大型表的完整数据库。如果你使用像Cassandra这样的NoSQL数据库,这应该是相当有效的,因为Cassandra非常好并且有效地处理写入。