我使用this方法编写csv文件。但它会生成一个包含多个零件文件的文件。那不是我想要的;我需要一个文件。我还发现another post使用scala强制在一个分区上计算所有内容,然后获取一个文件。
第一个问题:如何在Python中实现这一目标?
在第二篇文章中,还说Hadoop function
可以将多个文件合并为一个。
第二个问题:是否可以在Spark中合并两个文件?
答案 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文件。