【问题标题】:How to avoid generating crc files and SUCCESS files while saving a DataFrame?保存DataFrame时如何避免生成crc文件和SUCCESS文件?
【发布时间】:2016-03-26 18:08:49
【问题描述】:

我正在使用以下代码将 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 文件?

【问题讨论】:

    标签: json apache-spark spark-dataframe


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 问题是为什么我们需要CRC_SUCCESS 文件? Spark(worker)节点同时写入数据,这些文件用作验证的校验和。写入单个文件会消除分布式计算的想法,如果生成的文件太大,这种方法可能会失败。
    • _metadata 将不会创建,因为 this spark jira ticket 合并到 spark master 和 spark-2.0,related PR
    猜你喜欢
    • 1970-01-01
    • 2018-12-14
    • 2022-01-22
    • 1970-01-01
    • 2019-11-05
    • 2015-12-28
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多