如何在写入时控制Spark作业创建的输出部分文件的数量?

时间:2015-07-06 15:04:44

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

您好我有几个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创建的零件文件数量?最后我想使用这些镶木地板/ orc目录创建Hive表,当我们有大量的小文件时,我听说Hive很慢。请指导我是Spark新手。提前谢谢。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

从1.6开始,您可以对数据框使用重新分区,这意味着每个hive分区将获得1个文件。但是要注意大的改组,如果可能的话,最好从启动开始正确划分DF。 见https://stackoverflow.com/a/32920122/2204206