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

时间:2016-04-12 13:21:04

标签: pyspark

我使用this方法编写csv文件。但它会生成一个包含多个零件文件的文件。那不是我想要的;我需要一个文件。我还发现another post使用scala强制在一个分区上计算所有内容,然后获取一个文件。

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

在第二篇文章中,还说Hadoop function可以将多个文件合并为一个。

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

3 个答案:

答案 0 :(得分:7)

你可以使用,

df.coalesce(1).write.csv('result.csv')

注意: 当你使用合并功能时,你会失去并行性。

答案 1 :(得分:2)

您可以使用cat命令行功能执行此操作,如下所示。这会将所有零件文件连接成1个csv。无需重新分区为1分区。

from subprocess import call
test.write.format('com.databricks.spark.csv').save('output/test')
os.system("cat output/test/p* > output/test.csv")

答案 2 :(得分:0)

要求通过将RDD带到执行程序来将RDD保存在单个CSV文件中。这意味着跨执行程序存在的RDD分区将被混洗到一个执行程序。出于此目的,我们可以使用coalesce(1)repartition(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 context API方法可用于序列化为了节省空间而保存的数据。使用pickFile读取pickle文件。