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

Posted

技术标签:

【中文标题】如何将 pyspark 中的数据保存在 Amazon EMR 的 1 个文件中【英文标题】:How to save data in pyspark in 1 file in Amazon EMR 【发布时间】:2016-10-06 13:20:35 【问题描述】:

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

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】:

文件在每个分区中分离出一个。因此,如果您要单独查看数据,您会看到这一点。

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

【讨论】:

以上是关于如何将 pyspark 中的数据保存在 Amazon EMR 的 1 个文件中的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 使用名称中的变量将数据框保存到配置单元表

如何使用pyspark将数据框保存在“.txt”文件中

如何从 pyspark 数据框中更快地保存 csv 文件?

将 pyspark 中的数据框保存为 csv 中的 hivetable

我可以将 pyspark 数据框保存为哪些文件格式?

将行列表保存到 pyspark 中的 Hive 表