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

时间:2017-09-18 19:02:23

标签: python csv apache-spark pyspark

上周我很难从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文件是否意味着在这里垂直地连接它们,从头到尾。

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

这基本上是因为Spark根据分割数据的分区数转储文件。因此,每个分区都会单独转储它自己的文件。您可以使用coalesce选项将它们保存到单个文件中。查看this link了解详情。

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

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

  

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

答案 2 :(得分:4)

  

有谁知道为什么Spark会这样做,为什么它不会简单地输出csv,

因为它是为分布式计算而设计的,其中每个数据块(a.k.a。分区)都是独立编写的。

  

如何命名csv

名称取决于分区号。

  

该成功文件应该包含什么

无。它只是表明成功。