28

我正在使用以下代码将 spark DataFrame 保存到 JSON 文件

unzipJSON.write.mode("append").json("/home/eranw/Workspace/JSON/output/unCompressedJson.json")

输出结果是:

part-r-00000-704b5725-15ea-4705-b347-285a4b0e7fd8
.part-r-00000-704b5725-15ea-4705-b347-285a4b0e7fd8.crc
part-r-00001-704b5725-15ea-4705-b347-285a4b0e7fd8
.part-r-00001-704b5725-15ea-4705-b347-285a4b0e7fd8.crc
_SUCCESS
._SUCCESS.crc
  1. 如何生成单个 JSON 文件而不是每行一个文件?
  2. 如何避免 *crc 文件?
  3. 如何避免 SUCCESS 文件?
4

2 回答 2

36

如果你想要一个文件,你需要coalesce在调用 write 之前对单个分区做一个,所以:

unzipJSON.coalesce(1).write.mode("append").json("/home/eranw/Workspace/JSON/output/unCompressedJson.json")

就个人而言,我发现输出文件的数量取决于您在调用之前拥有的分区数量非常烦人write- 特别是如果您使用 a 执行writea partitionBy- 但据我所知,目前没有其他方法。

我不知道是否有办法禁用 .crc 文件——我不知道有哪一种——但您可以通过在 Spark 上下文的 hadoop 配置中设置以下内容来禁用 _SUCCESS 文件。

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")

请注意,您可能还希望通过以下方式禁用元数据文件的生成:

sc.hadoopConfiguration.set("parquet.enable.summary-metadata", "false")

显然,生成元数据文件需要一些时间(请参阅此博客文章),但实际上并不那么重要(根据)。就个人而言,我总是禁用它们并且我没有遇到任何问题。

于 2015-12-20T20:43:16.313 回答
1

只是上面答案的一点更新。要禁用 crc 和 SUCCESS 文件,只需在 spark 会话中设置属性如下(示例)

spark = SparkSession \
        .builder \
        .appName("Python Spark SQL Hive integration example") \
        .config("spark.sql.warehouse.dir", warehouse_location) \
        .enableHiveSupport() \
        .getOrCreate()

    spark.conf.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")
于 2022-01-09T10:52:22.813 回答