¿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.mapyRDD.flatMapen é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.mapflatMapRespuestas:
Aquí hay un ejemplo de la diferencia, como
spark-shellsesión:Primero, algunos datos: dos líneas de texto:
Ahora,
maptransforma 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
mapcon nuestrasplitfunció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 usarflatMappara filtrar los elementos que devuelvenNoney 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"]]?splitsobre 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
mapy usaré yflatMapveremos 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
mapyflatMap.Utilizando
mapLa entrada tiene 4 líneas y el tamaño de salida también es 4, es decir, N elementos ==> N elementos.
Utilizando
flatMapEl resultado es diferente del mapa.
Asignemos 1 como valor para cada clave para obtener el recuento de palabras.
fm: RDD creado usandoflatMapwc: RDD creado usandomapMientras que
flatMapen RDDwcdará el siguiente resultado no deseado:No puede obtener el recuento de palabras si
mapse usa en lugar deflatMap.Según la definición, la diferencia entre
mapyflatMapes:fuente
.map(lambda line:line.split(" "))no es una matriz de cadenas. Debería cambiardata.collect()awc.collecty 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.mdcomo ejemplo:Si usa el
mapmétodo, obtendrá las líneas detest.md, para elflatMapmétodo, obtendrá el número de palabras.El
mapmétodo es similar aflatMap, todos ellos devuelven un nuevo RDD.mapmétodo a menudo para usar devolver un nuevo RDD,flatMapmétodo a menudo para usar palabras divididas.fuente
mapdevuelve RDD del mismo número de elementos, mientras queflatMappuede que no.Un ejemplo de caso de uso para
flatMapFiltrar datos faltantes o incorrectos.Un ejemplo de caso de
mapuso 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
flatMappara 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
mapfunció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
mapuso de scala:Mapa plano :
A
flatMapes 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
flatMapuso 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.mapdevuelve todos los elementos en una sola matrizRDD.flatMapdevuelve 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 nuevoRDDaplicando una función a cada elemento deRDD. La función en .map solo puede devolver un elemento.flatMap: Similar a un mapa, devuelve una nuevaRDDmediante la aplicación de una función a cada elemento de la RDD, pero la salida se aplana.Además, function in
flatMappuede 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)
flatMapSalida:
2
map.:Salida:
fuente
ratos
fuente