在 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 作业中创建单个镶木地板文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?
使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧