我有几个 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 很慢。
最佳答案
您可能想尝试使用DataFrame.coalesce减少分区数量的方法;它返回一个具有指定数量分区的 DataFrame(每个分区在插入时都成为一个文件)。
要增加或减少分区,您可以使用Dataframe.repartition
函数。
但coalesce
不会导致随机播放,而repartition
则会导致随机播放。
关于apache-spark - 如何控制Spark作业在写入时创建的输出部分文件的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31249265/