我有一对夫妇的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 job在最终输出目录中创建了大量的小零件文件。据我所知,Spark为每个分区/任务创建零件文件-这是正确的吗?我们如何控制Spark创建的零件文件的数量?
最后,我想使用这些parquet/orc目录创建配置单元表,我听说当我们有大量的小文件时,配置单元很慢。
2条答案
按热度按时间xqnpmsa81#
您可能希望尝试使用DataFrame.coalesce方法来减少分区的数量;它返回具有指定分区数的DataFrame(每个分区在插入时都成为一个文件)。
要增加或减少分区,您可以使用
Dataframe.repartition
函数。但是coalesce
不会导致shuffle,而repartition
会。rfbsl7qr2#
从1.6开始你可以对 Dataframe 使用repartition,这意味着你将得到每个配置单元分区的一个文件。但是要小心大的shuffle,如果可能的话,最好从一开始就对你的DF进行正确的分区。参见https://stackoverflow.com/a/32920122/2204206