Первое различие между этими двумя заключается в том, что forEach()
- это действие, когда mapPartition()
- это преобразование.Было бы более целесообразно сравнить forEach
с forEachPartition
, поскольку они оба являются действиями и работают с окончательно накопленными данными в драйвере.Обратитесь здесь для подробного обсуждения этих двух вопросов.Что касается потребления памяти, это действительно зависит от того, сколько данных вы возвращаете в драйвер.В качестве эмпирического правила не забудьте вернуть результаты в драйвере, используя такие методы, как limit(), take(), first()
и т. Д., И избегайте использования collect()
, если вы не уверены, что данные могут поместиться в памяти драйвера.
mapPartition
можно сравнить с функциями map
или flatMap
, и они будут изменять данные СДР, применяя какое-то преобразование.mapPartition более эффективен, поскольку он будет выполнять данную функцию меньше раз, когда map будет выполнять то же самое для каждого элемента в наборе данных.См. здесь для получения более подробной информации об этих двух.