【问题标题】:PySpark: spit out single file when writing instead of multiple part filesPySpark:写入时吐出单个文件而不是多个部分文件
【发布时间】:2016-07-09 19:01:28
【问题描述】:

有没有办法防止 PySpark 在将 DataFrame 写入 JSON 文件时创建多个小文件?

如果我跑:

 df.write.format('json').save('myfile.json')

df1.write.json('myfile.json')

它创建了名为myfile 的文件夹,在其中我找到了几个名为part-*** 的小文件,HDFS 方式。是否有可能让它吐出一个文件?

【问题讨论】:

  • 不,除非你想coalesce(1)(你真的应该避免这种情况)。为什么需要这个?
  • 我需要从另一个 Python,非 pyspark,脚本读取文件
  • @martina 如果您有一个可以从 S3 读取的代码,那么如果您读取单个文件或几个文件,这真的很重要(假设数量足够低,因此您不会遇到不同的 S3 问题) .您可以简单地chain 阅读。
  • toPandas 只是一个 collect 加上一些闪亮的补充。如果您可以接受collect,您可以接受toPandas。如果不是...你回到广场一。如果要在本地处理数据,那么它可能是比收集、推送和加载回更好的选择。
  • 如果你需要数据为一个文件,你应该collect他们。否则,您应该接受 Hadoop 方式。这就是使用分布式计算环境的意义所在。

标签: python amazon-s3 apache-spark pyspark apache-spark-sql


【解决方案1】:

这对我来说是一个更好的解决方案。

rdd.map(json.dumps) .saveAsTextFile(json_lines_file_name)

【讨论】:

【解决方案2】:

好吧,您的确切问题的答案是coalesce 函数。但正如已经提到的那样,它根本没有效率,因为它会迫使一个工作人员获取所有数据并按顺序写入。

df.coalesce(1).write.format('json').save('myfile.json')

附:顺便说一句,结果文件不是有效的 json 文件。它是一个每行一个 json 对象的文件。

【讨论】:

  • 关于JSON的无效性,无论如何都会发生这种情况,即使吐出几个文件。
  • @martina,是的。有时看到 .json 扩展名和内部没有有效的 json 文件会令人困惑:D
  • 对我来说,这一行创建了一个名为 myfile.json 的目录,其中包含一个部分文件(使用 spark 2.4)
【解决方案3】:

df1.rdd.repartition(1).write.json('myfile.json')

会很好,但不可用。检查这个相关的问题。 https://stackoverflow.com/a/33311467/2843520

【讨论】:

  • df.coalesce(1).write.json('myfile.json') 工作正常
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2023-03-27
  • 2020-03-04
相关资源
最近更新 更多