【问题标题】:Why does Spark output a set of csv's instead or just one?为什么 Spark 输出一组 csv 而不是只输出一个?
【发布时间】:2018-02-27 09:54:48
【问题描述】:

上周我很难从 Spark 中获取数据,最后我不得不简单地选择

df.toPandas().to_csv('mycsv.csv')

this 的答案。

我测试过更原生的

df.write.csv('mycsv.csv')

对于 Spark 2.0+,但根据下面的the comment,它会删除一组 csv 文件,而不是需要连接的一个文件,无论在这种情况下这意味着什么。它还将一个空文件放入名为“success”之类的目录中。目录名称是 /mycsv/,但 csv 本身有一个由一长串字符组成的难以理解的名称。

这是我第一次听说这样的事情。嗯,Excel 有多个选项卡,必须以某种方式反映在 .xls 文件中,NumPy 数组可以是多维的,但我认为 csv 文件只是一个标题,值在行中用逗号分隔成列。

Another answer 建议:

query.repartition(1).write.csv("cc_out.csv", sep='|')

所以这只会删除一个文件和空白的“成功”文件,但文件仍然没有您想要的名称,目录有。

有谁知道 Spark 为什么要这样做,为什么它不会简单地输出一个 csv,它如何命名 csv,该成功文件应该包含什么,以及连接 csv 文件是否意味着在这里将它们垂直连接起来,从头到尾。

【问题讨论】:

    标签: python csv apache-spark pyspark


    【解决方案1】:

    Spark 输出多个 CSV 有几个原因:
    - Spark 在分布式集群上运行。对于大型数据集,所有数据可能无法放在一台机器上,但它可以放在一组机器上。要编写一个 CSV,所有数据可能都必须在一台机器上并由一台机器写入,而一台机器可能无法做到这一点。
    - Spark 专为速度而设计。如果数据存在于 5 个执行器的 5 个分区上,那么并行写入 5 个 CSV 而不是将所有数据移动到单个执行器并让一个执行器写入整个数据集是有意义的。

    如果您需要一个 CSV,我的假设是您的数据集不是超级大。我的建议是将所有 CSV 文件下载到一个目录中,然后在相关目录中运行 cat *.csv > output.csv。这将头对尾地加入您的 CSV 文件。如果您使用标题编写,您可能需要做更多的工作来从每个部分文件中去除标题。

    【讨论】:

    • 我在这里阅读了每个答案几次,都很有帮助,但你的两点确实最好地解决了它的 为什么,因此被接受了。下次我必须使用它时,我必须重新了解所有这些术语 - 主节点、执行程序、分区、机器、Hadoop 文件系统。
    【解决方案2】:

    有谁知道Spark为什么要这样做,为什么不简单的输出一个csv,

    因为它是为分布式计算而设计的,其中每个数据块(也称为分区)都是独立于其他数据写入的。

    它是如何命名 csv 的

    名称取决于分区号。

    该成功文件应该包含什么

    什么都没有。它只是表示成功。

    【讨论】:

      【解决方案3】:

      这基本上是因为 Spark 转储文件是基于数据在其间划分的分区数。因此,每个分区都会简单地单独转储它自己的文件。您可以使用合并选项将它们保存到单个文件中。检查this link 了解更多信息。

      但是这种方法有个缺点,就是需要收集Master Node中的所有数据,所以Master Node应该有足够的内存。在this answer 中可以看到解决方法。

      This link 还提供了有关 Spark 的这种行为的更多信息:

      Spark 就像 Hadoop - 实际上使用 Hadoop - 执行诸如将数据输出到 HDFS 之类的操作。当您第一次尝试保存“all-the-data.csv”时,您会知道我的意思,并惊讶地发现一个名为 all-the-data.csv/ 的目录包含一个 0 字节的 _SUCCESS 文件,然后是几个部分-参与作业的每个分区都有 0000n 个文件。

      【讨论】:

        猜你喜欢
        • 2016-09-24
        • 2017-02-02
        • 1970-01-01
        • 2021-09-01
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        相关资源
        最近更新 更多