使用少于N个分区的N个文件将数据写入磁盘

Ken*_*nny 1 partition apache-spark

我们可以写100个文件的数据,每个文件有10个分区吗?

我知道我们可以使用重新分区或合并来减少分区数量。但是我看到一些hadoop生成的avro数据具有比文件数量更多的分区。

Sil*_*vio 6

写入的文件数由DataFrame或RDD的并行化控制。因此,如果将数据划分为10个Spark分区,则在不减少分区(例如coalescerepartition)的情况下,您写的文件数不能少于10 。

现在,已经说过,当您读回数据时,可以根据配置的拆分大小,但取决于格式和/或压缩,将数据拆分为较小的块。

相反,如果您想增加每个Spark分区写入的文件数量(例如,防止文件太大),则maxRecordsPerFile在写入数据时,Spark 2.2会引入一个选项。这样,您可以限制每个分区中每个文件写入的记录数。当然,另一个选择是重新分区。

即使只有1个分区,以下操作也会导致2个文件被写出:

val df = spark.range(100).coalesce(1)
df.write.option("maxRecordsPerFile", 50).save("/tmp/foo")
Run Code Online (Sandbox Code Playgroud)

  • 是的,Avro 是可拆分的。因此,当 Spark 读取它时,它会根据块大小将单个文件拆分为多个分区。您可以在代码本身中看到“isSplittable”方法为“true”的位置:https://github.com/databricks/spark-avro/blob/branch-4.0/src/main/scala/com/databricks/spark/ avro/DefaultSource.scala#L103 (3认同)