Qual a diferença entre um RDD map
e um mapPartitions
método? E se flatMap
comporta como map
ou como mapPartitions
? Obrigado.
(editar) ie qual é a diferença (semanticamente ou em termos de execução) 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)
}
E:
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
fonte
fonte
Respostas:
O mapa do método converte cada elemento do RDD de origem em um único elemento do RDD resultante, aplicando uma função. mapPartitions converte cada partição do RDD de origem em vários elementos do resultado (possivelmente nenhum).
O flatMap também não funciona em um único elemento (as
map
) e produz vários elementos do resultado (asmapPartitions
).fonte
map
eflatMap
têm exatamente as mesmas partições que o pai.map
basicamente pega sua funçãof
e a passa paraiter.map(f)
. Então, basicamente, é um método de conveniência que envolvemapPartitions
. Eu ficaria surpreso se houvesse uma vantagem de desempenho de qualquer maneira para um trabalho de transformação de estilo de mapa puro (ou seja, onde a função é idêntica), se você precisar criar alguns objetos para processamento, se esses objetos puderem ser compartilhados,mapPartitions
seria vantajoso.Criança levada. DICA :
Sim. veja o exemplo 2 de
flatmap
.. é auto-explicativo.Cenário de exemplo : se tivermos 100 mil elementos em um determinado
RDD
partição , dispararemos a função que está sendo usada pela transformação de mapeamento 100K vezes quando usamosmap
.Por outro lado, se usarmos
mapPartitions
, chamaremos a função específica apenas uma vez, mas passaremos todos os 100 mil registros e receberemos de volta todas as respostas em uma chamada de função.Haverá ganho de desempenho desde
map
funciona em uma função específica tantas vezes, especialmente se a função estiver fazendo algo caro a cada vez que não seria necessário se passássemos todos os elementos de uma só vez (no caso demappartitions
).mapa
Exemplo:
mapPartitions
Exemplo 1
Exemplo 2
O programa acima também pode ser escrito usando o flatMap da seguinte maneira.
Exemplo 2 usando flatmap
Conclusão:
mapPartitions
a transformação é mais rápida do quemap
uma vez que chama sua função uma vez / partição, não uma vez / elemento.Leitura adicional: foreach Vs foreachPartitions Quando usar o quê?
fonte
map
oumapPartitions
obter o mesmo resultado (veja os dois exemplos na pergunta); Esta pergunta é sobre por que você escolheria um caminho sobre o outro. Os comentários na outra resposta são realmente úteis! Além disso, você não mencionou quemap
eflatMap
passarfalse
parapreservesPartitioning
, e quais as implicações disso são.map
é melhor quemapPartitions
? SemapPartitions
é tão bom, por que não é a implementação de mapa padrão?Mapa :
MapPartitions
fonte