¿Cuál es la diferencia entre un RDD map
y un mapPartitions
método? ¿Y se flatMap
comporta como map
o como mapPartitions
? Gracias.
(editar) es decir, ¿cuál es la diferencia (semánticamente o en términos de ejecución) entre
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)
}
Y:
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
Nicholas White
fuente
fuente
Respuestas:
El mapa de métodos convierte cada elemento del RDD de origen en un único elemento del RDD resultante mediante la aplicación de una función. mapPartitions convierte cada partición del RDD de origen en múltiples elementos del resultado (posiblemente ninguno).
Tampoco, flatMap funciona en un solo elemento (as
map
) y produce múltiples elementos del resultado (asmapPartitions
).fuente
map
yflatMap
tienen exactamente las mismas particiones como el padre.map
básicamente toma su funciónf
y la pasa aiter.map(f)
. Básicamente, es un método de conveniencia que se envuelvemapPartitions
. Me sorprendería si hubiera una ventaja de rendimiento en ambos sentidos para un trabajo de transformación de estilo de mapa puro (es decir, donde la función es idéntica), si necesita crear algunos objetos para el procesamiento, si estos objetos se pueden compartir,mapPartitions
sería ventajoso.Diablillo. PROPINA :
Si. vea el ejemplo 2 de
flatmap
... se explica por sí mismo.Escenario de ejemplo : si tenemos 100K elementos en una
RDD
particiónparticular,activaremos la función que está siendo utilizada por la transformación de mapeo 100K veces cuando la usemosmap
.Por el contrario, si usamos
mapPartitions
, solo llamaremos a la función particular una vez, pero pasaremos todos los registros de 100K y recuperaremos todas las respuestas en una llamada de función.Habrá aumento de rendimiento ya que
map
funciona en una función en particular tantas veces, especialmente si la función está haciendo algo costoso cada vez que no tendría que hacerlo si pasamos todos los elementos a la vez (en caso demappartitions
).mapa
Ejemplo:
mapPartitions
Ejemplo 1
Ejemplo 2
El programa anterior también se puede escribir usando flatMap de la siguiente manera.
Ejemplo 2 usando mapa plano
Conclusión
mapPartitions
la transformación es más rápida quemap
ya que llama a su función una vez / partición, no una vez / elemento ...Lecturas adicionales: foreach Vs foreachPartitions Cuándo usar ¿Qué?
fuente
map
omapPartitions
lograr el mismo resultado (ver los dos ejemplos en la pregunta); Esta pregunta es acerca de por qué elegirías un camino sobre el otro. ¡Los comentarios en la otra respuesta son realmente útiles! Además, no mencionaste esomap
yflatMap
pasastefalse
apreservesPartitioning
, y cuáles son las implicaciones de eso.map
es mejor quemapPartitions
? SimapPartitions
es tan bueno, ¿por qué no es la implementación de mapa predeterminada?Mapa :
MapPartitions
fuente