Очевидный способ - использовать partitonBy
.Следующий код (в Scala) создаст папку для каждого города с необходимыми данными.
val df = List(
("city1","A1"),
("city2","A2"),
("city1","C1"),
("city2","B2"),
("city1","B1"),
("city2","C2"))
.toDF("city","val")
df.sort("city", "val")
.withColumn("city-part",col("city"))
.coalesce(1)
.write
.partitionBy("city-part")
.format("csv")
.save("/output-path")
Обратите внимание, что для того, чтобы внутри выходного файла был столбец "city", мы добавляем еще один столбец (city-part) с тем же значением для фрейма данных и использовать его для разделения.