Обновление : Мой оригинальный ответ содержал ошибку: Spark поддерживает Seq
как результат flatMap
(и преобразует результат обратно в Dataset
),Извиняюсь за путаницу.Я также добавил дополнительную информацию об улучшении производительности вашего анализа.
Обновление 2 : я пропустил, что вы используете Dataset
вместо RDD
(doh!).Это не оказывает существенного влияния на ответ.
Spark - это распределенная система, которая распределяет данные по нескольким узлам и обрабатывает данные параллельно.С точки зрения эффективности, действия, которые приводят к перераспределению (требующему передачи данных между узлами), намного дороже с точки зрения времени выполнения, чем изменения на месте.Также следует отметить, что операции, которые просто преобразуют данные , такие как filter
, map
, flatMap
и т. Д., Просто сохраняются и не выполняются до действия выполняется операция (например, reduce
, fold
, aggregate
и т. д.).Следовательно, ни одна альтернатива на самом деле ничего не делает в том виде, в каком она существует.
Когда действие выполняется в результате этих преобразований, я ожидаю, что операция filter
будет гораздо более эффективной: она обрабатывает только данные (используяпоследующая операция map
, которая передает предикат x=>x.age>25
(более типично записываемый как _.age > 25
).Хотя может показаться, что filter
создает промежуточную коллекцию, она выполняется лениво.В результате Spark объединяет операции filter
и map
.
Ваша операция flatMap
, откровенно говоря, отвратительна.Это форсирует обработку, создание последовательности и последующее выравнивание каждого элемента данных, что, безусловно, увеличит общую обработку.
Тем не менее, лучший способ улучшить производительность вашего анализа - это управление секционированием, чтобы данные былиразделить примерно равномерно по максимально возможному количеству узлов.См. это руководство как хорошую отправную точку.