在非常大的数据集上执行联接

时间:2016-03-23 17:29:16

标签: csv join bigdata

我收到了几个我需要合并到一个文件中的CSV文件,所有这些文件都有一个我可以用来加入它们的公共密钥。不幸的是,每个文件大小约为5 GB(数百万行,大约20-100 +列),所以将它们加载到内存并对每个文件执行连接是不可行的,但我知道我不必担心它们之间存在列冲突。

我尝试为每个ID对应每个ID创建一个行的索引,这样我就可以在不使用太多内存的情况下计算结果,但当然,当实际尝试查找每一行时,这个时间本身很慢,拉动来自行的其余CSV数据,将其连接到正在进行的数据,然后写出到文件。即使在SSD上,这也不可行,以处理每个文件中的数百万行。

我还尝试简单地在内存中加载一些较小的集合并对它们运行parallel.foreach以匹配必要的数据以转储回临时合并文件。虽然这比上一个方法更快,但我只是没有内存来处理更大的文件。

我理想情况下只想完成最大文件的完全左连接,然后完全左连接到每个随后的较小文件,以便它们全部合并。

除此之外我怎么办才能解决这个问题?我在这个系统上有24 gb的内存可供使用,还有6个内核可以使用。

虽然这可能只是在关系数据库中加载并在那里进行加入时遇到的问题,但我认为在走这条路线之前我会伸手去看看是否有任何想法从我当地解决这个问题系统

谢谢!

3 个答案:

答案 0 :(得分:1)

关系数据库是第一个浮现在脑海中的东西,可能是最简单的,但是除非... ...

构建哈希表映射键到文件偏移量。在您加入时按需解析行。如果您的密钥空间仍然太大而无法容纳可用的地址空间,您也可以将其放在文件中。这正是数据库索引所做的事情(尽管可能有b树)。

您还可以根据键对文件进行预排序,然后进行合并连接。

答案 1 :(得分:1)

好消息是"几个" 5GB文件并不是一个庞大的数据量。我知道它的亲戚,但你描述你的系统的方式......我仍然认为这不是什么大不了的事。如果您不需要加入,可以使用Perl或其他一些命令行工具。

每个文件中是否都知道列名?你关心列名吗?

我的第一个想法:

  1. 启动Amazon Web Services(AWS)弹性MapReduce(EMR)实例(即使是非常小的实例也可以)
  2. 上传这些文件
  3. 将文件导入Hive(管理与否)。
  4. 在Hive中执行联接。
  5. 您可以在几分钟内启动一个实例,并在一小时左右的时间内完成工作,具体取决于您对材料的舒适程度。

    我不在亚马逊工作,在日常工作中甚至无法使用他们的东西,但我在毕业学校使用它相当多。当您需要自己的大数据集群时,它就像一个冠军。同样,这不是大数据(R)",但是Hive会立刻为你杀掉它。

    这篇文章并不能完全满足您的需求(它从S3复制数据);但是,它将帮助您了解表创建等。 http://aws.amazon.com/articles/5249664154115844

    修改 这是EMR概述的链接: https://aws.amazon.com/elasticmapreduce/

答案 2 :(得分:0)

我不确定你是否正在操纵数据。但如果只是结合使用csv,你可以尝试这个...... http://www.solveyourtech.com/merge-csv-files/