在 s3 pyspark 作业中创建单个镶木地板文件

Posted

技术标签:

【中文标题】在 s3 pyspark 作业中创建单个镶木地板文件【英文标题】:creating a single parquet file in s3 pyspark job 【发布时间】:2020-12-09 07:00:46 【问题描述】:

我编写了一个 pyspark 程序,它从 cassandra 读取数据并写入 aws s3 。在写入 s3 之前,我必须执行 repartition(1) 或 coalesce(1) 因为这会创建一个文件,否则会在 s3 中创建多个 parquet 文件。 使用 repartition(1) 或 coalesce(1) 存在性能问题,我觉得创建一个大分区不是处理大量数据的好选择。 有哪些方法可以在 s3 中创建一个文件但不影响性能?

【问题讨论】:

如果你只想要一个输出文件,那么你可以使用 coalesce(1),另一方面,如果你想得到 n 个偶数大小的部分,你可以使用 repartition(n) -文件,理想情况下,您的文件输出大小应在磁盘中的 128MB 到 1 GB 之间,以便 Spark 在下次读取时有效地处理它们。 【参考方案1】:

coalesce(1)repartition(1) 会将您的所有数据放在 1 个分区上(与 coalesce 相比,使用 repartition 时有一个随机播放步骤)。在这种情况下,只有 1 个工作人员需要写入您的所有数据,这就是您遇到性能问题的原因 - 您已经弄清楚了。

这是您可以使用 Spark 在 S3 上写入 1 个文件的唯一方法。目前,仅使用 Spark 没有其他方法。

使用 Python(或 Scala),您可以做一些其他事情。例如,您使用 spark 编写所有文件而不更改分区数,然后:

您使用 python 获取文件 您将文件连接为一个 您在 S3 上上传该文件。

它适用于 CSV,但不适用于非顺序文件类型。

【讨论】:

以上是关于在 s3 pyspark 作业中创建单个镶木地板文件的主要内容,如果未能解决你的问题,请参考以下文章

awswrangler 将镶木地板数据帧写入单个文件

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

使用 Pyspark 在 s3 中写入镶木地板文件时出错

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中

无法使用 Pyspark 2.4.4 读取 s3 存储桶中的镶木地板文件