为什么Spark会输出一组csv而不是一个?

car*_*mom 1 python csv apache-spark pyspark

上周我很难从Spark中获取数据,最后我不得不随意使用

df.toPandas().to_csv('mycsv.csv')
Run Code Online (Sandbox Code Playgroud)

出于这个答案.

我测试了更多的原生

df.write.csv('mycsv.csv')
Run Code Online (Sandbox Code Playgroud)

对于Spark 2.0+但是根据下面的注释,它会丢弃一组csv文件而不是一个需要连接的文件,无论在这种情况下是什么意思.它还将一个空文件放入名为"success"的目录中.目录名是/ mycsv /,但csv本身的长字符串中有一个难以理解的名称.

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

另一个答案是:

query.repartition(1).write.csv("cc_out.csv", sep='|')
Run Code Online (Sandbox Code Playgroud)

因此,这只会删除一个文件和空白的"成功"文件,但该文件仍然没有您想要的名称,该目录的名称.

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

chr*_*non 7

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

如果您需要一个CSV,我的假设是您的数据集不是超大的.我的建议是将所有CSV文件下载到一个目录中,并cat *.csv > output.csv在相关目录中运行.这将连接您的CSV文件.如果您正在使用标题编写,则可能需要执行更多工作来从每个零件文件中删除标题.

  • 我多次阅读这里的每个答案,都很有帮助,但您的两点确实解决了**为什么****,因此被接受。必须复习所有这些术语 - 主节点、执行器、分区、机器、Hadoop 文件系统,以便下次我必须使用它。 (2认同)

Moh*_*hif 6

这基本上是因为Spark根据分割数据的分区数转储文件.因此,每个分区都会单独转储它自己的文件.您可以使用coalesce选项将它们保存到单个文件中.请查看此链接以获取更多信息.

但是,这种方法的缺点是它需要收集主节点中的所有数据,因此主节点应该包含足够的内存.在这个答案中可以看到解决方法.

此链接还提供了有关Spark的这种行为的更多信息:

Spark就像Hadoop一样 - 事实上使用Hadoop来执行将数据输出到HDFS等操作.你第一次尝试保存"all-the-data.csv"时会明白我的意思,并且惊讶地发现一个名为all-the-data.csv /的目录包含一个0字节_SUCCESS文件,然后是几个部分 - 参与作业的每个分区的0000n文件.


小智 5

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

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

它如何命名 csv

名称取决于分区号。

成功文件应该包含什么

没有。它只是表明成功。