spark 写入 N 个文件小于 N 个分区的磁盘
spark write to disk with N files less than N partitions
能不能写入100个文件,每个文件10个分区?
我知道我们可以使用重新分区或合并来减少分区数。但是我看到一些 hadoop 生成的 avro 数据的分区比文件数量多得多。
写出的文件数量由 DataFrame 或 RDD 的并行化控制。因此,如果您的数据分布在 10 个 Spark 分区中,则在不减少分区的情况下,您不能写入少于 10 个文件(例如 coalesce
或 repartition
)。
现在,话虽如此,当数据被读回时,它可以根据您配置的拆分大小拆分成更小的块,但取决于格式 and/or 压缩。
如果您想增加每个 Spark 分区写入的文件数量(例如,为了防止文件太大),Spark 2.2 在您写出数据时引入了一个 maxRecordsPerFile
选项。有了这个,您可以限制每个分区中每个文件写入的记录数。另一种选择当然是重新分区。
以下将导致 2 个文件被写出,即使它只有 1 个分区:
val df = spark.range(100).coalesce(1)
df.write.option("maxRecordsPerFile", 50).save("/tmp/foo")
能不能写入100个文件,每个文件10个分区?
我知道我们可以使用重新分区或合并来减少分区数。但是我看到一些 hadoop 生成的 avro 数据的分区比文件数量多得多。
写出的文件数量由 DataFrame 或 RDD 的并行化控制。因此,如果您的数据分布在 10 个 Spark 分区中,则在不减少分区的情况下,您不能写入少于 10 个文件(例如 coalesce
或 repartition
)。
现在,话虽如此,当数据被读回时,它可以根据您配置的拆分大小拆分成更小的块,但取决于格式 and/or 压缩。
如果您想增加每个 Spark 分区写入的文件数量(例如,为了防止文件太大),Spark 2.2 在您写出数据时引入了一个 maxRecordsPerFile
选项。有了这个,您可以限制每个分区中每个文件写入的记录数。另一种选择当然是重新分区。
以下将导致 2 个文件被写出,即使它只有 1 个分区:
val df = spark.range(100).coalesce(1)
df.write.option("maxRecordsPerFile", 50).save("/tmp/foo")