¿Cuál es la diferencia entre un RDD map y un mapPartitionsmétodo? ¿Y se flatMapcomporta como mapo 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
mapyflatMaptienen exactamente las mismas particiones como el padre.mapbásicamente toma su funciónfy 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,mapPartitionsserí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
RDDpartició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
mapfunciona 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
mapPartitionsla transformación es más rápida quemapya que llama a su función una vez / partición, no una vez / elemento ...Lecturas adicionales: foreach Vs foreachPartitions Cuándo usar ¿Qué?
fuente
mapomapPartitionslograr 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 esomapyflatMappasastefalseapreservesPartitioning, y cuáles son las implicaciones de eso.mapes mejor quemapPartitions? SimapPartitionses tan bueno, ¿por qué no es la implementación de mapa predeterminada?Mapa :
MapPartitions
fuente