Я бы предложил вызвать df.repartition(NUM_PARTITIONS)
на фрейме данных, чтобы равномерно распределить строки по разделам.В вашем случае для категории = A строки будут распределены по большему количеству разделов, скажем, по сравнению с категорией C. После перераспределения, когда вы вызываете write.partitionBy("category")
, для категории A, поскольку она была распределена по большему количеству разделов, большее количествофайлы будут записаны (один файл на раздел категории A).
NUM_PARTITIONS может быть динамическим, как NUM_PARTITIONS = df.count()%ROWS_PER_PARTITION
.Вы можете решить, сколько ROWS_PER_PARTITION в зависимости от размера байта в строке.
NUM_PARTITIONS = 100
df.repartition(NUM_PARTITIONS).write.partitionBy("category").parquet(output_dir)
Если вы хотите проверить, как распределены разделы, вы можете использовать это
import pyspark.sql.functions as f
df.withColumn("partition_id",f.spark_partition_id()).groupBy("partition_id").count().show()
. Для более подробных обсуждений вы увидите это Spark SQL - Разница между df.repartition и DataFrameWriter partitionBy?