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

时间:2016-10-06 13:20:36

标签: pyspark amazon-emr

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

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

如何在下一个结构中保存数据?

/mnt/dump/gp/
part-00000

1 个答案:

答案 0 :(得分:0)

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

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]

如果你看到分区可见:

rdd.glom().collect() 
--> [[1, 2], [3, 4], [5, 6], [7, 8, 9]]

因此,当您保存它时,它会将文件分成4个部分。

正如其他人在类似问题中提出的建议,即how to make saveAsTextFile NOT split output into multiple file?,您可以将数据集coalesce缩减为1个单一分区,然后保存:

coalesce(1,true).saveAsTextFile("s3://myBucket/path/to/file.txt")

然而,警告:Spark首先处理多个分区中的数据的原因是因为对于非常大的数据集,每个节点都可以处理较小的数据。当您coalesce缩减为1个分区时,您将整个数据集强制转换为单个节点。如果你没有可用的内存,你就会遇到麻烦。资料来源:NullPointerException in Spark RDD map when submitted as a spark job