【问题标题】:Writing .txt files to GCS from Spark/Dataproc: How to write only one large file instead of it automatically splitting in to multiple?从 Spark/Dataproc 将 .txt 文件写入 GCS:如何只写入一个大文件而不是自动拆分成多个文件?
【发布时间】:2020-03-04 02:44:42
【问题描述】:

我使用 Dataproc 运行 Pyspark 脚本,该脚本将数据帧写入谷歌云存储桶中的文本文件。当我使用大数据运行脚本时,我的输出文件夹中会自动出现大量文本文件,但我只需要一个大文件。

我在这里阅读Spark saveAsTextFile() writes to multiple files instead of one 我可以在 .write() 之前使用 .repartition(1) 来获取一个文件,但我希望它运行得快(当然)所以我不想回到之前的一个分区执行 .write()。

df_plain = df.select('id', 'string_field1').write.mode('append').partitionBy('id').text('gs://evatest/output', compression="gzip")

【问题讨论】:

    标签: python pyspark google-cloud-storage google-cloud-dataproc


    【解决方案1】:

    不要将 GCS 视为文件系统。 GCS 存储桶的内容是一组不可变的 blob(文件)。一旦写入,就无法更改。我的建议是让您的工作独立编写所有文件并在最后汇总它们。有很多方法可以实现这一点。

    最简单的方法是通过gsutil compose 命令。

    参考资料:

    【讨论】:

    • 谢谢,这就是我得出的结论。有什么办法可以将它用于我的 pyspark?也许使用子进程,这可靠吗?从 Cloud Functions 运行它有什么优势吗?
    • 将多个文件合并为一个文件是在 GCP 中本地执行的。因此,您提交合并请求的位置不是问题。这是 API 的链接...googleapis.dev/python/storage/latest/blobs.htmlgoogleapis.dev/nodejs/storage/latest/Bucket.html#combine 您可以从任何您想要的地方调用它。如果您的应用程序知道所有文件的写入时间,那么这可能是一个理想的组合位置。
    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多