Насколько я знаю, в Spark нет такого стандартного инструмента.В случае искаженных данных, очень распространенным является добавление искусственного столбца для дальнейшей группировки данных.
Допустим, вы хотите разделить по столбцу "y", но данные очень искажены, как в этом игрушечном примере(1 раздел с 5 строками, остальные с одной строкой):
val df = spark.range(8).withColumn("y", when('id < 5, 0).otherwise('id))
df.show()
+---+---+
| id| y|
+---+---+
| 0| 0|
| 1| 0|
| 2| 0|
| 3| 0|
| 4| 0|
| 5| 5|
| 6| 6|
| 7| 7|
+-------+
Теперь давайте добавим искусственный случайный столбец и напишем фрейм данных.
val maxNbOfBuckets = 3
val part_df = df.withColumn("r", floor(rand() * nbOfBuckets))
part_df.show
+---+---+---+
| id| y| r|
+---+---+---+
| 0| 0| 2|
| 1| 0| 2|
| 2| 0| 0|
| 3| 0| 0|
| 4| 0| 1|
| 5| 5| 2|
| 6| 6| 2|
| 7| 7| 1|
+---+---+---+
// and writing. We divided the partition with 5 elements into 3 partitions.
part_df.write.partitionBy("y", "r").csv("...")