¿Alguien puede explicarme la diferencia entre map y flatMap y cuál es un buen caso de uso para cada uno?
¿Qué significa "aplanar los resultados"? ¿Para que sirve?
apache-spark
Eran Witkon
fuente
fuente
RDD.map
yRDD.flatMap
en él . En general, las operaciones RDD de Spark se modelan después de sus correspondientes operaciones de colección Scala. Las respuestas en stackoverflow.com/q/1059776/590203 , que discuten la distinción entre y en Scala, pueden serle útiles.map
flatMap
Respuestas:
Aquí hay un ejemplo de la diferencia, como
spark-shell
sesión:Primero, algunos datos: dos líneas de texto:
Ahora,
map
transforma un RDD de longitud N en otro RDD de longitud N.Por ejemplo, asigna de dos líneas a dos longitudes de línea:
Pero
flatMap
(hablando en términos generales) transforma un RDD de longitud N en una colección de N colecciones, luego las aplana en un único RDD de resultados.Tenemos varias palabras por línea y varias líneas, pero terminamos con una única matriz de palabras de salida
Solo para ilustrar eso, flatMapping de una colección de líneas a una colección de palabras se ve así:
Por lo tanto, los RDD de entrada y salida serán típicamente de diferentes tamaños para
flatMap
.Si hubiéramos tratado de usar
map
con nuestrasplit
función, habríamos terminado con estructuras anidadas (un RDD de matrices de palabras, con tipoRDD[Array[String]]
) porque tenemos que tener exactamente un resultado por entrada:Finalmente, un caso especial útil es el mapeo con una función que podría no devolver una respuesta y, por lo tanto, devuelve un
Option
. Podemos usarflatMap
para filtrar los elementos que devuelvenNone
y extraer los valores de los que devuelven unSome
:(observando aquí que una Opción se comporta más bien como una lista que tiene un elemento o cero elementos)
fuente
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?split
sobre una lista de cadenas producirá una lista de matrices)Generalmente usamos el ejemplo de conteo de palabras en hadoop. Tomaré el mismo caso de uso
map
y usaré yflatMap
veremos la diferencia en cómo se procesan los datos.A continuación se muestra el archivo de datos de muestra.
El archivo anterior se analizará usando
map
yflatMap
.Utilizando
map
La entrada tiene 4 líneas y el tamaño de salida también es 4, es decir, N elementos ==> N elementos.
Utilizando
flatMap
El resultado es diferente del mapa.
Asignemos 1 como valor para cada clave para obtener el recuento de palabras.
fm
: RDD creado usandoflatMap
wc
: RDD creado usandomap
Mientras que
flatMap
en RDDwc
dará el siguiente resultado no deseado:No puede obtener el recuento de palabras si
map
se usa en lugar deflatMap
.Según la definición, la diferencia entre
map
yflatMap
es:fuente
.map(lambda line:line.split(" "))
no es una matriz de cadenas. Debería cambiardata.collect()
awc.collect
y verá una matriz de matrices.wc.collect()
?Si está preguntando la diferencia entre RDD.map y RDD.flatMap en Spark, map transforma un RDD de tamaño N a otro de tamaño N. p.ej.
por ejemplo, si myRDD está compuesto por Dobles.
Si bien flatMap puede transformar el RDD en otro de un tamaño diferente: por ejemplo:
que devolverá un RDD de tamaño 2 * N o
fuente
Se reduce a su pregunta inicial: ¿qué quiere decir con aplanamiento ?
fuente
Usar
test.md
como ejemplo:Si usa el
map
método, obtendrá las líneas detest.md
, para elflatMap
método, obtendrá el número de palabras.El
map
método es similar aflatMap
, todos ellos devuelven un nuevo RDD.map
método a menudo para usar devolver un nuevo RDD,flatMap
método a menudo para usar palabras divididas.fuente
map
devuelve RDD del mismo número de elementos, mientras queflatMap
puede que no.Un ejemplo de caso de uso para
flatMap
Filtrar datos faltantes o incorrectos.Un ejemplo de caso de
map
uso para Uso en una amplia variedad de casos donde el número de elementos de entrada y salida es el mismo.number.csv
map.py agrega todos los números en add.csv.
flatMap.py utiliza
flatMap
para filtrar los datos faltantes antes de la adición. Se agregan menos números en comparación con la versión anterior.fuente
map y flatMap son similares, en el sentido de que toman una línea del RDD de entrada y le aplican una función. La forma en que difieren es que la función en el mapa devuelve solo un elemento, mientras que la función en flatMap puede devolver una lista de elementos (0 o más) como un iterador.
Además, la salida de flatMap se aplana. Aunque la función en flatMap devuelve una lista de elementos, flatMap devuelve un RDD que tiene todos los elementos de la lista de manera plana (no una lista).
fuente
todos los ejemplos son buenos ... Aquí hay una buena ilustración visual ... cortesía de la fuente: DataFlair training of spark
Mapa: un mapa es una operación de transformación en Apache Spark. Se aplica a cada elemento de RDD y devuelve el resultado como un nuevo RDD. En el Mapa, el desarrollador de operaciones puede definir su propia lógica empresarial personalizada. La misma lógica se aplicará a todos los elementos de RDD.
La
map
función Spark RDD toma un elemento como proceso de entrada de acuerdo con el código personalizado (especificado por el desarrollador) y devuelve un elemento a la vez. Map transforma un RDD de longitud N en otro RDD de longitud N. Los RDD de entrada y salida normalmente tendrán el mismo número de registros.Ejemplo de
map
uso de scala:Mapa plano :
A
flatMap
es una operación de transformación. Se aplica a cada elemento de RDD y devuelve el resultado como nuevoRDD
. Es similar a Map, pero FlatMap permite devolver 0, 1 o más elementos de la función de mapa. En la operación FlatMap, un desarrollador puede definir su propia lógica empresarial personalizada. La misma lógica se aplicará a todos los elementos del RDD.Una función FlatMap toma un elemento como proceso de entrada de acuerdo con el código personalizado (especificado por el desarrollador) y devuelve 0 o más elementos a la vez.
flatMap
() transforma un RDD de longitud N en otro RDD de longitud M.Ejemplo de
flatMap
uso de scala:fuente
La diferencia se puede ver en el siguiente código de ejemplo de pyspark:
fuente
Flatmap y Map transforman la colección.
Diferencia:
map (func)
Devuelve un nuevo conjunto de datos distribuido formado al pasar cada elemento de la fuente a través de una función func.
flatMap (func)
Similar a map, pero cada elemento de entrada se puede asignar a 0 o más elementos de salida (por lo que func debería devolver una Seq en lugar de un solo elemento).
La función de transformación:
mapa : un elemento de entrada -> un elemento de salida.
flatMap : un elemento dentro -> 0 o más elementos fuera (una colección).
fuente
RDD.map
devuelve todos los elementos en una sola matrizRDD.flatMap
devuelve elementos en matrices de matrizsupongamos que tenemos texto en el archivo text.txt como
Usando el mapa
salida:
Usando flatMap
salida:
fuente
Para todos aquellos que han querido PySpark relacionados:
Transformación de ejemplo: flatMap
['Hola Qué estás haciendo']
Rastreo (última llamada más reciente): Archivo "", línea 1, en AttributeError: el objeto 'list' no tiene atributo 'split'
[['hola', 'qué', 'son', 'tú', 'haciendo'], ['esto', 'es', 'rak']]
['hola', 'qué', 'son', 'tú', 'haciendo', 'esto', 'es', 'rak']
Espero eso ayude :)
fuente
map
: Devuelve un nuevoRDD
aplicando una función a cada elemento deRDD
. La función en .map solo puede devolver un elemento.flatMap
: Similar a un mapa, devuelve una nuevaRDD
mediante la aplicación de una función a cada elemento de la RDD, pero la salida se aplana.Además, function in
flatMap
puede devolver una lista de elementos (0 o más)Por ejemplo:
Fuente: https://www.linkedin.com/pulse/difference-between-map-flatmap-transformations-spark-pyspark-pandey/
fuente
mapa :
es un método de orden superior que toma una función como entrada y la aplica a cada elemento en el RDD de origen.
http://commandstech.com/difference-between-map-and-flatmap-in-spark-what-is-map-and-flatmap-with-examples/
mapa plano:
Un método de orden superior y una operación de transformación que toma una función de entrada.
fuente
Diferencia en la salida de map y flatMap:
1)
flatMap
Salida:
2
map
.:Salida:
fuente
ratos
fuente