Quelle est la différence entre un RDD map
et une mapPartitions
méthode? Et flatMap
se comporte comme map
ou comme mapPartitions
? Merci.
(modifier) c'est-à-dire quelle est la différence (soit sémantiquement, soit en termes d'exécution) 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)
}
Et:
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
Nicolas White
la source
la source
Réponses:
La méthode map convertit chaque élément du RDD source en un seul élément du RDD résultat en appliquant une fonction. mapPartitions convertit chaque partition du RDD source en plusieurs éléments du résultat (éventuellement aucun).
Ni l'un ni l'autre, flatMap ne fonctionne sur un seul élément (as
map
) et produit plusieurs éléments du résultat (asmapPartitions
).la source
map
etflatMap
ont exactement les mêmes partitions que le parent.map
prend essentiellement votre fonctionf
, et la transmet dansiter.map(f)
. Donc, fondamentalement, c'est une méthode pratique qui s'enroulemapPartitions
. Je serais surpris s'il y avait un avantage de performance de toute façon pour un travail de transformation de style de carte pure (c'est-à-dire où la fonction est identique), si vous avez besoin de créer des objets pour le traitement, si ces objets peuvent être partagés, cemapPartitions
serait avantageux.Lutin. POINTE :
Oui. s'il vous plaît voir l'exemple 2 de
flatmap
.. son explicite.Exemple de scénario : si nous avons 100K éléments dans une
RDD
partitionparticulière,nous déclencherons la fonction utilisée par la transformation de mappage 100K fois lorsque nous l'utilisonsmap
.Inversement, si nous utilisons,
mapPartitions
nous n'appellerons la fonction particulière qu'une seule fois, mais nous passerons tous les enregistrements de 100K et récupérerons toutes les réponses en un seul appel de fonction.Il y aura un gain de performance puisque
map
travaille sur une fonction particulière tant de fois, surtout si la fonction fait quelque chose de cher à chaque fois qu'elle n'aurait pas besoin de faire si nous passions tous les éléments à la fois (dans le cas demappartitions
).carte
Exemple :
mapPartitions
Exemple 1
Exemple 2
Le programme ci-dessus peut également être écrit en utilisant flatMap comme suit.
Exemple 2 avec flatmap
Conclusion :
mapPartitions
la transformation est plus rapide quemap
puisqu'elle appelle votre fonction une fois / partition, pas une fois / élément.Lectures complémentaires: foreach Vs foreachPartitions Quand utiliser Quoi?
la source
map
oumapPartitions
obtenir le même résultat (voir les deux exemples dans la question); cette question est de savoir pourquoi vous choisiriez une voie plutôt qu'une autre. Les commentaires dans l'autre réponse sont vraiment utiles! De plus, vous ne l'avez pas mentionnémap
etflatMap
passéfalse
àpreservesPartitioning
, et quelles sont les implications de cela.map
vaut mieux quemapPartitions
? SimapPartitions
c'est si bon, pourquoi n'est-ce pas l'implémentation de carte par défaut?Carte :
MapPartitions
la source