spark 写入 N 个文件小于 N 个分区的磁盘

spark write to disk with N files less than N partitions

能不能写入100个文件,每个文件10个分区?

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

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

现在,话虽如此,当数据被读回时,它可以根据您配置的拆分大小拆分成更小的块,但取决于格式 and/or 压缩。

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

以下将导致 2 个文件被写出,即使它只有 1 个分区:

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