【问题标题】:Performing joins on very large data sets在非常大的数据集上执行连接
【发布时间】:2016-07-11 03:22:22
【问题描述】:

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

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

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

理想情况下,我希望对最大的文件进行完全左连接,然后对每个后续较小的文件进行完全左连接,以便将它们全部合并。

否则我该如何解决这个问题?我在这个系统上有 24 GB 的内存可以使用,还有六个内核可以使用。

虽然这可能只是在关系数据库中加载并从那里进行连接的问题,但我想在走这条路之前我会先联系一下,看看是否有任何想法可以从我的本地解决这个问题系统。

谢谢!

【问题讨论】:

    标签: csv join bigdata


    【解决方案1】:

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

    每个文件中的列名是否已知?你关心列名吗?

    我的第一个想法:

    1. 启动 Amazon Web Services (AWS) Elastic MapReduce (EMR) 实例(即使是很小的实例也可以使用)
    2. 上传这些文件
    3. 将文件导入 Hive(无论是否托管)。
    4. 在 Hive 中执行联接。

    您可以在几分钟内启动一个实例,并在一个小时左右的时间内完成工作,具体取决于您对材料的熟悉程度。

    我不为亚马逊工作,在我的日常工作中甚至不能使用他们的东西,但我在读研究生时经常使用它。当您需要自己的大数据集群时,它就像一个冠军。同样,这不是“大数据 (R)”,但 Hive 会立即为您解决这个问题。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不幸的是,我需要将它与密钥连接起来(幸好在所有文件的第一列中),所以我不能简单地连接所有内容,但是谢谢!
      【解决方案3】:

      关系数据库是首先想到的,可能也是最简单的,但除此之外......

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

      您还可以根据文件的键对文件进行预排序并进行合并。

      【讨论】:

        猜你喜欢
        • 2020-02-23
        • 1970-01-01
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多