В вашем подходе есть две проблемы с производительностью:
- Использование глобального заказа
- Выполнение шаффла для построения групп
k
Если вам абсолютно необходим глобальный порядок, начиная со строки 1, и вы не можете разбить данные на несколько разделов, тогда Spark должен переместить все данные через одно ядро. Вы можете ускорить эту часть, найдя способ иметь более одного раздела.
Вы можете избежать случайного перемешивания, обрабатывая данные по одному разделу за раз, используя mapPartitions
:
spark.range(1, 20).coalesce(1).mapPartitions(_.grouped(5)).show
+--------------------+
| value|
+--------------------+
| [1, 2, 3, 4, 5]|
| [6, 7, 8, 9, 10]|
|[11, 12, 13, 14, 15]|
| [16, 17, 18, 19]|
+--------------------+
Обратите внимание, что coalesce(1)
выше вынуждает все 20 строк в один раздел.