Alguém pode me explicar a diferença entre map e flatMap e qual é um bom caso de uso para cada um?
O que significa "achatar os resultados"? Para que serve?
apache-spark
Eran Witkon
fonte
fonte
RDD.map
eRDD.flatMap
no Apache Spark . Em geral, as operações de RDD do Spark são modeladas após as operações de coleta correspondentes do Scala. As respostas em stackoverflow.com/q/1059776/590203 , que discutem a distinção entremap
eflatMap
no Scala, podem ser úteis para você.Respostas:
Aqui está um exemplo da diferença, como uma
spark-shell
sessão:Primeiro, alguns dados - duas linhas de texto:
Agora,
map
transforma um RDD de comprimento N em outro RDD de comprimento N.Por exemplo, ele mapeia de duas linhas em dois comprimentos de linha:
Mas
flatMap
(em termos gerais) transforma um RDD de comprimento N em uma coleção de N coleções e depois as nivela em um único RDD de resultados.Temos várias palavras por linha e várias linhas, mas acabamos com uma única matriz de palavras de saída
Apenas para ilustrar isso, o flatMapping de uma coleção de linhas para uma coleção de palavras se parece com:
Os RDDs de entrada e saída serão, portanto, tipicamente de tamanhos diferentes para
flatMap
.Se tentássemos usar
map
com nossasplit
função, teríamos terminado com estruturas aninhadas (um RDD de arrays de palavras, com tipoRDD[Array[String]]
) porque precisamos ter exatamente um resultado por entrada:Finalmente, um caso especial útil é o mapeamento com uma função que pode não retornar uma resposta e, portanto, retorna um
Option
. Podemos usarflatMap
para filtrar os elementos que retornamNone
e extrair os valores daqueles que retornam aSome
:(observando aqui que uma opção se comporta como uma lista que possui um elemento ou zero elementos)
fonte
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?split
mais de uma lista de Cordas vai produzir uma lista de matrizes)Geralmente usamos o exemplo de contagem de palavras no hadoop. Vou pegar o mesmo caso de uso e vou usar
map
eflatMap
veremos a diferença em como ele está processando os dados.Abaixo está o arquivo de dados de amostra.
O arquivo acima será analisado usando
map
eflatMap
.Usando
map
A entrada possui 4 linhas e o tamanho da saída também é 4, ou seja, N elementos ==> N elementos.
Usando
flatMap
A saída é diferente do mapa.
Vamos atribuir 1 como valor para cada chave para obter a contagem de palavras.
fm
: RDD criado usandoflatMap
wc
: RDD criado usandomap
Enquanto que
flatMap
no RDDwc
fornecerá a saída indesejada abaixo:Você não pode obter a contagem de palavras se
map
for usada em vez deflatMap
.De acordo com a definição, a diferença entre
map
eflatMap
é:fonte
.map(lambda line:line.split(" "))
não é uma matriz de seqüências de caracteres. Você deve mudardata.collect()
parawc.collect
e verá uma matriz de matrizes.wc.collect()
?Se você está perguntando a diferença entre RDD.map e RDD.flatMap no Spark, o map transforma um RDD do tamanho N em outro do tamanho N. por exemplo.
por exemplo, se myRDD for composto de Duplas.
Enquanto o flatMap pode transformar o RDD em outro de tamanho diferente: por exemplo:
que retornará um RDD do tamanho 2 * N ou
fonte
Tudo se resume à sua pergunta inicial: o que você quer dizer com achatamento ?
fonte
Use
test.md
como exemplo:Se você usar o
map
método, obterá as linhas detest.md
, para oflatMap
método, obterá o número de palavras.O
map
método é semelhanteflatMap
, todos eles retornam um novo RDD.map
método frequentemente usado para retornar um novo RDD,flatMap
método freqüentemente usado para dividir palavras.fonte
map
retorna RDD de igual número de elementos, enquantoflatMap
não pode.Um exemplo de caso de uso para
flatMap
Filtrar dados ausentes ou incorretos.Um exemplo de caso de uso para
map
Uso em uma ampla variedade de casos em que o número de elementos de entrada e saída é o mesmo.number.csv
map.py adiciona todos os números em add.csv.
O flatMap.py usa
flatMap
para filtrar os dados ausentes antes da adição. Menos números são adicionados em comparação com a versão anterior.fonte
map e flatMap são semelhantes, no sentido em que pegam uma linha do RDD de entrada e aplicam uma função nele. A diferença deles é que a função no mapa retorna apenas um elemento, enquanto a função no flatMap pode retornar uma lista de elementos (0 ou mais) como um iterador.
Além disso, a saída do flatMap é achatada. Embora a função no flatMap retorne uma lista de elementos, o flatMap retorna um RDD que possui todos os elementos da lista de maneira simples (não uma lista).
fonte
todos os exemplos são bons ... Aqui está uma boa ilustração visual ... cortesia de fonte: treinamento DataFlair de faísca
Mapa: um mapa é uma operação de transformação no Apache Spark. Aplica-se a cada elemento do RDD e retorna o resultado como novo RDD. No mapa, o desenvolvedor da operação pode definir sua própria lógica comercial personalizada. A mesma lógica será aplicada a todos os elementos do RDD.
A
map
função Spark RDD utiliza um elemento como processo de entrada, de acordo com o código personalizado (especificado pelo desenvolvedor) e retorna um elemento por vez. O mapa transforma um RDD de comprimento N em outro RDD de comprimento N. Os RDDs de entrada e saída normalmente terão o mesmo número de registros.Exemplo de
map
uso do scala:FlatMap:
A
flatMap
é uma operação de transformação. Aplica-se a cada elemento do RDD e retorna o resultado como novoRDD
. É semelhante ao Map, mas o FlatMap permite retornar 0, 1 ou mais elementos da função map. Na operação do FlatMap, um desenvolvedor pode definir sua própria lógica comercial personalizada. A mesma lógica será aplicada a todos os elementos do RDD.Uma função FlatMap pega um elemento como processo de entrada, de acordo com o código personalizado (especificado pelo desenvolvedor) e retorna 0 ou mais elementos por vez.
flatMap
() transforma um RDD de comprimento N em outro RDD de comprimento M.Exemplo de
flatMap
uso do scala:fonte
A diferença pode ser vista abaixo do código pyspark de exemplo:
fonte
O Flatmap e o Map transformam a coleção.
Diferença:
map (func)
Retorna um novo conjunto de dados distribuído formado passando cada elemento da fonte por uma função func.
flatMap (func)
Semelhante ao mapa, mas cada item de entrada pode ser mapeado para 0 ou mais itens de saída (portanto, func deve retornar um Seq em vez de um único item).
A função de transformação:
map : Um elemento dentro -> um elemento fora.
flatMap : Um elemento dentro -> 0 ou mais elementos fora (uma coleção).
fonte
RDD.map
retorna todos os elementos em uma única matrizRDD.flatMap
retorna elementos em matrizes da matrizvamos supor que temos texto no arquivo text.txt como
Usando mapa
resultado:
Usando flatMap
resultado:
fonte
Para todos aqueles que queriam o PySpark relacionado:
Transformação de exemplo: flatMap
['Olá O que você está fazendo']
Traceback (última chamada mais recente): o arquivo "", linha 1, no AttributeError: o objeto 'list' não tem atributo 'split'
[['olá', 'o que', 'são', 'você', 'fazendo'], ['este', 'é', 'rak']]
['olá', 'o que', 'são', 'você', 'fazendo', 'isso', 'é', 'rak']
Espero que ajude :)
fonte
map
: Retorna um novoRDD
aplicando uma função a cada elemento doRDD
. A função .map pode retornar apenas um item.flatMap
: Semelhante para mapear, ele retorna uma novaRDD
pela aplicação de uma função a cada elemento do RDD, mas a saída é achatada.Além disso, a função in
flatMap
pode retornar uma lista de elementos (0 ou mais)Por exemplo:
Fonte: https://www.linkedin.com/pulse/difference-between-map-flatmap-transformations-spark-pyspark-pandey/
fonte
mapa:
é um método de ordem superior que aceita uma função como entrada e a aplica a cada elemento no RDD de origem.
http://commandstech.com/difference-between-map-and-flatmap-in-spark-what-is-map-and-flatmap-with-examples/
flatMap:
um método de ordem superior e operação de transformação que assume uma função de entrada.
fonte
Diferença na saída do mapa e do flatMap:
1
flatMap
Resultado:
2
map
.:Resultado:
fonte
enquanto
fonte