gpt4 book ai didi

apache-spark - 如何控制输出文件的大小?

转载 作者:行者123 更新时间:2023-12-02 17:34:47 35 4
gpt4 key购买 nike

在spark中,控制输出文件大小的最佳方法是什么。例如,在 log4j 中,我们可以指定最大文件大小,之后文件会轮换。

我正在寻找类似的 Parquet 文件解决方案。写入文件时是否有最大文件大小选项可用?

我有一些解决方法,但没有一个是好的。如果我想将文件限制为 64mb,那么一种选择是重新分区数据并写入临时位置。然后使用临时位置中的文件大小将文件合并在一起。但获得正确的文件大小很困难。

最佳答案

Spark 无法控制 Parquet 文件的大小,因为内存中的 DataFrame 在写入磁盘之前需要进行编码和压缩。在此过程完成之前,无法估计磁盘上的实际文件大小。

所以我的解决方案是:

  • 将 DataFrame 写入 HDFS,df.write.parquet(path)
  • 获取目录大小并计算文件数量

    val fs = FileSystem.get(sc.hadoopConfiguration)
    val dirSize = fs.getContentSummary(path).getLength
    val fileNum = dirSize/(512 * 1024 * 1024) // let's say 512 MB per file
  • 读取目录并重新写入HDFS

    val df = sqlContext.read.parquet(path)
    df.coalesce(fileNum).write.parquet(another_path)

    不要重复使用原来的df,否则会触发你的作业两次。

  • 删除旧目录并重命名新目录

    fs.delete(new Path(path), true)
    fs.rename(new Path(newPath), new Path(path))

这个方案有一个缺点,就是需要写入两次数据,这会导致磁盘IO增加一倍,但目前这是唯一的方案。

关于apache-spark - 如何控制输出文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39187622/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com