如何在Amazon EMR中将pyspark中的数据保存在1文件中

如何在Amazon EMR中将pyspark中的数据保存在1文件中,pyspark,amazon-emr,Pyspark,Amazon Emr,我使用下一个代码将数据保存到本地磁盘 receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp') 但我有下一个目录结构 receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp') [hadoop@ip-172-31-16-209 ~]$ cd /mnt/dump [hadoop@ip-172-31-16-209

我使用下一个代码将数据保存到本地磁盘

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
但我有下一个目录结构

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
[hadoop@ip-172-31-16-209 ~]$ cd /mnt/dump
[hadoop@ip-172-31-16-209 dump]$ ls -R
.:
gp
./gp:
_temporary
./gp/_temporary:
0

./gp/_temporary/0:
task_201610061116_0000_m_000000  _temporary

./gp/_temporary/0/task_201610061116_0000_m_000000:

part-00000
如何在下一个结构中保存数据

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
/mnt/dump/gp/
part-00000

每个分区将文件分开一个。因此,如果您要查看自己的数据,您会看到这一点

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9], 4) # as "4" partitions
rdd.collect()
--> [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果在分区可见的情况下查看:

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
rdd.glom().collect() 
--> [[1, 2], [3, 4], [5, 6], [7, 8, 9]]
因此,当您保存它时,它将保存分为4部分的文件

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
正如其他人在类似问题中所建议的,即,您可以
将数据集合并为一个分区,然后保存:

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
coalesce(1,true).saveAsTextFile("s3://myBucket/path/to/file.txt")

但是,警告:Spark首先处理跨多个分区的数据的原因是,对于非常大的数据集,每个节点都可以处理较小的数据。当您将
合并到一个分区时,您将把整个数据集强制合并到一个节点中。如果你没有那方面的记忆,你会有麻烦的。来源:

每个分区将文件分开一个。因此,如果您要查看自己的数据,您会看到这一点

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
rdd = sc.parallelize([1, 2, 3, 4, 5, 6, 7, 8, 9], 4) # as "4" partitions
rdd.collect()
--> [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果在分区可见的情况下查看:

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
rdd.glom().collect() 
--> [[1, 2], [3, 4], [5, 6], [7, 8, 9]]
因此,当您保存它时,它将保存分为4部分的文件

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
正如其他人在类似问题中所建议的,即,您可以
将数据集合并为一个分区,然后保存:

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')
coalesce(1,true).saveAsTextFile("s3://myBucket/path/to/file.txt")
但是,警告:Spark首先处理跨多个分区的数据的原因是,对于非常大的数据集,每个节点都可以处理较小的数据。当您将
合并到一个分区时,您将把整个数据集强制合并到一个节点中。如果你没有那方面的记忆,你会有麻烦的。资料来源:

receiptR.write.format('com.databricks.spark.csv').save('file:/mnt/dump/gp')