我只有 dataset.write().format("parquet").save("path");
不,在源代码的任何地方合并/分区。
具有 4 个执行器的远程集群
案例一: 输入大小:500 MB(单个文件中有 100 万条记录)
输出大小:180 MB(1 个单部分文件)- 假设 HDFS 块大小为 180 MB(我尚未确认,但我可以安全地假设 HDFS 块大小 >= 180 MB,因为它创建了一个180 MB 大小的文件,如果我在这里错了请纠正我)
我在这里的期望是 Spark 会创建类似于 CASE 2 的多个零件文件。
案例 2: 输入大小:50 MB(5 个输入文件)
输出大小:多个不同大小的零件文件
我想了解 Spark 确定其生成的零件文件数量的行为。
如果 Spark 转储到一个文件中,则意味着数据集只有一个分区。要强制转储到多个文件中,您需要将
repartition
与更多分区一起使用
dataset.repartition(2).write().format("parquet").save("path");
Spark 根据以下因素决定分区数量:
两种控制分区数量的配置:
spark.files.maxPartitionBytes
这是读取文件时打包到单个分区的最大字节数(默认为128MB),所以如果你有一个500MB的文件那么分区数就是4个分区。spark.sql.files.minPartitionNum
这是读取文件时建议的(不保证)最小分区数。默认为spark.default.parallelism
,默认等于MAX(集群中的核心总数,2)。