如何通过pyspark将csv文件写入一个文件

如何通过pyspark将csv文件写入一个文件,pyspark,Pyspark,我用这个方法来写csv文件。但它将生成一个包含多个零件文件的文件。这不是我想要的;我需要一个文件。我还发现使用scala可以强制在一个分区上计算所有内容,然后得到一个文件 第一个问题:如何在Python中实现这一点? 在第二篇文章中,也有人说,Hadoop函数可以将多个文件合并为一个文件 第二个问题:是否可以在Spark中合并两个文件?您可以使用下面的cat命令行功能来完成此操作。这将把所有零件文件连接成一个csv。无需将分区向下重新划分为1个分区 import os test.write.cs

我用这个方法来写csv文件。但它将生成一个包含多个零件文件的文件。这不是我想要的;我需要一个文件。我还发现使用scala可以强制在一个分区上计算所有内容,然后得到一个文件

第一个问题:如何在Python中实现这一点?

在第二篇文章中,也有人说,
Hadoop函数
可以将多个文件合并为一个文件


第二个问题:是否可以在Spark中合并两个文件?

您可以使用下面的cat命令行功能来完成此操作。这将把所有零件文件连接成一个csv。无需将分区向下重新划分为1个分区

import os
test.write.csv('output/test')
os.system("cat output/test/p* > output/test.csv")

要求是通过将RDD提交给执行者,将RDD保存在单个CSV文件中。这意味着跨执行器存在的RDD分区将被洗牌到一个执行器。为此,我们可以使用
合并(1)
重新分区(1)
。除此之外,还可以向生成的csv文件添加列标题。 首先,我们可以保留一个实用函数,使数据与csv兼容

def toCSVLine(data):
    return ','.join(str(d) for d in data)
假设MyRDD有五列,它需要“ID”、“DT_KEY”、“Grade”、“Score”、“TRF_Age”作为列标题。因此,我创建了一个标题RDD和union MyRDD,如下所示,大多数情况下,它将标题保持在csv文件的顶部

unionHeaderRDD = sc.parallelize( [( 'ID','DT_KEY','Grade','Score','TRF_Age' )])\
   .union( MyRDD )

unionHeaderRDD.coalesce( 1 ).map( toCSVLine ).saveAsTextFile("MyFileLocation" )
saveAsPickleFile
spark上下文API方法可用于序列化为节省空间而保存的数据。使用
pickFile
读取pickle文件。

您可以使用

df.coalesce(1).write.csv('result.csv')
注意:
当您使用合并函数时,您将失去并行性。

是的,这里的情况是古怪的,因为主崩溃…:(我还没有确认自己的情况,但怀疑您在使用大文件时遇到内存问题。我认为当作业在群集模式下运行时,这不会有帮助,但每个执行器上都会有不同的文件。这在AWS S3之类的云blob上不起作用。请注意,如果您选择保存头文件,则会将其保存到所有部分,因此,当y如果将它们连接在一起,您将拥有现在是数据一部分的标题。