В чем разница между RDD map
и mapPartitions
методом? И ведет flatMap
себя как map
или нравитсяmapPartitions
? Спасибо.
(править) то есть в чем разница (семантически или с точки зрения исполнения) между
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.mapPartitions({ iter: Iterator[A] => for (i <- iter) yield fn(i) },
preservesPartitioning = true)
}
И:
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.map(fn)
}
performance
scala
apache-spark
rdd
Николас Уайт
источник
источник
Ответы:
Метод карта преобразует каждый элемент исходного RDD в единый элемент результата RDD путем применения функции. mapPartitions преобразует каждый раздел исходного RDD в несколько элементов результата (возможно, ни одного).
Также flatMap работает с одним элементом (as
map
) и производит несколько элементов результата (asmapPartitions
).источник
map
иflatMap
имеют точно такие же разделы, что и родитель.map
в основном берет вашу функциюf
и передает ее вiter.map(f)
. Так что в основном это удобный метод, который обертываетmapPartitions
. Я был бы удивлен, если бы было преимущество в производительности в любом случае для задания преобразования чистого стиля карты (то есть, когда функция идентична), если вам нужно создать некоторые объекты для обработки, если эти объекты могут использоваться совместно, тогдаmapPartitions
было бы выгодно.Настоятельный НАКОНЕЧНИК :
Да. см. пример 2
flatmap
.. это не требует пояснений.Пример сценария : если у нас есть 100 КБ элементов в конкретном
RDD
разделе, тогда мы 100 КБ запускаем функцию, используемую преобразованием отображения, когда используемmap
.И наоборот, если мы используем,
mapPartitions
то мы вызовем конкретную функцию только один раз, но мы передадим все 100K записей и вернем все ответы за один вызов функции.Произойдет прирост производительности, поскольку
map
много раз работает с определенной функцией, особенно если функция каждый раз делает что-то дорогостоящее, чего не нужно было бы делать, если бы мы передали все элементы сразу (в случаеmappartitions
).карта
Пример :
mapPartitions
Пример 1
Пример 2
Вышеупомянутая программа также может быть написана с использованием flatMap следующим образом.
Пример 2 с использованием плоской карты
Вывод :
mapPartitions
преобразование происходит быстрее, чемmap
поскольку оно вызывает вашу функцию один раз / раздел, а не один раз / элемент ..Дополнительная литература: foreach против foreachPartitions Когда использовать Что?
источник
map
илиmapPartitions
для достижения того же результата (см. Два примера в вопросе); этот вопрос о том, почему вы предпочли бы один путь другому. Комментарии в другом ответе действительно полезны! Кроме того , вы не упомянули , чтоmap
иflatMap
передатьfalse
кpreservesPartitioning
, и каковы последствия, которые.map
лучше чемmapPartitions
? ЕслиmapPartitions
это так хорошо, почему это не реализация карты по умолчанию?Карта :
MapPartitions
источник