我使用下一个代码将数据保存到本地磁盘
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
答案 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