上周我很难从 Spark 中获取数据,最后我不得不简单地使用
df.toPandas().to_csv('mycsv.csv')
出this回答。
我测试过比较原生的
df.write.csv('mycsv.csv')
对于 Spark 2.0+ 但根据 the comment在下面,它会删除一组 csv 文件,而不是需要连接的文件,无论在此上下文中意味着什么。它还将一个空文件放入名为“success”之类的目录中。目录名称是/mycsv/,但 csv 本身有一个由一长串字符组成的难以理解的名称。
这是我第一次听说这样的事情。嗯,Excel 有多个选项卡,必须以某种方式反射(reflect)在 .xls 文件中,而 NumPy 数组可以是多维的,但我认为 csv 文件只是一个标题,值在行中用逗号分隔成列。
query.repartition(1).write.csv("cc_out.csv", sep='|')
所以这只删除一个文件和空白的“成功”文件,文件仍然没有你想要的名字,目录有。
有谁知道为什么 Spark 这样做,为什么它不简单地输出一个 csv,它如何命名 csv,成功文件应该包含什么,以及连接 csv 文件是否意味着在这里垂直连接它们,从头到尾。
请您参考如下方法:
Spark 输出多个 CSV 有几个原因:
- Spark 在分布式集群上运行。对于大型数据集,所有数据可能无法放在一台机器上,但可以放在一组机器上。要写一个CSV,所有的数据大概都得在一台机器上,用一台机器写,一台机器不一定能做到。
- Spark 专为速度而设计。如果数据存在于 5 个执行器的 5 个分区上,并行写入 5 个 CSV 比将所有数据移动到单个执行器并让一个执行器写入整个数据集更有意义。
如果您需要一个 CSV,我的假设是您的数据集不是特别大。我的建议是将所有 CSV 文件下载到一个目录中,然后在相关目录中运行 cat *.csv > output.csv。这会将您的 CSV 文件从头到尾加入。如果您使用标题编写,您可能需要做更多的工作来从每个零件文件中去除标题。
