2015-12-20 148 views
6

我使用下面的代码保存火花数据帧以JSON文件如何避免在保存DataFrame时生成crc文件和SUCCESS文件?

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文件?

回答

8

如果你想有一个单一的文件,你需要调用write之前做​​3210到单个分区,所以:

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

就个人而言,我觉得很烦人,输出文件的数量取决于在拨打write之前您有分区数 - 特别是如果您使用partitionBywrite - 但据我所知,目前没有其他方法。

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

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

注意,你可能还需要禁用元数据文件的生成有:

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

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

+0

问题是为什么我们需要'CRC'和'_SUCCESS'文件? Spark(worker)节点同时写入数据,这些文件充当验证的校验和。写入单个文件会消除分布式计算的想法,如果结果文件过大,则此方法可能会失败。 –

相关问题