【问题标题】:How to control the number of output part files created by Spark job upon writing?如何控制 Spark 作业在写入时创建的输出零件文件的数量?
【发布时间】:2015-09-23 19:14:19
【问题描述】:

我有几个 Spark 作业,每天处理数千个文件。文件大小可能从 MB 到 GB。完成工作后,我通常使用以下代码保存

finalJavaRDD.saveAsParquetFile("/path/in/hdfs"); OR
dataFrame.write.format("orc").save("/path/in/hdfs") //storing as ORC file as of Spark 1.4

Spark 作业在最终输出目录中创建大量小部件文件。据我了解,Spark 会为每个分区/任务创建部分文件,如果我错了,请纠正我。我们如何控制 Spark 创建的部分文件的数量?

最后,我想使用这些 parquet/orc 目录创建 Hive 表,我听说当我们没有大量小文件时,Hive 很慢。

【问题讨论】:

    标签: apache-spark hive apache-spark-sql parquet


    【解决方案1】:

    您可能想尝试使用DataFrame.coalesce 方法来减少分区数;它返回一个具有指定数量的分区的 DataFrame(每个分区在插入时成为一个文件)。

    要增加或减少分区,您可以使用Dataframe.repartition 函数。 但是coalesce 不会导致随机播放,而repartition 会。

    【讨论】:

      【解决方案2】:

      从 1.6 开始,您可以在数据帧上使用重新分区,这意味着您将获得每个配置单元分区 1 个文件。不过要小心大洗牌,如果可能的话,最好让你的 DF 从一开始就正确分区。 见https://stackoverflow.com/a/32920122/2204206

      【讨论】:

        猜你喜欢
        • 2018-11-15
        • 1970-01-01
        • 2018-10-18
        • 2023-03-18
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-05-21
        • 1970-01-01
        相关资源
        最近更新 更多