Apache Spark: carte vs mapPartitions?
Quelle est la différence entre un CA l' map
et mapPartitions
méthode? Et ne flatMap
se comportent comme des map
ou comme mapPartitions
? Merci.
(edit)
autrement dit, quelle est la différence (soit sémantiquement ou dans les conditions 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)
}
- Après la lecture de la réponse ci-dessous, vous pouvez jeter un oeil à cette expérience partagée par quelqu'un qui l'a utilisé.(bzhangusc.wordpress.com/2014/06/19/...) bzhangusc.wordpress.com/2014/06/19/...
Vous devez vous connecter pour publier un commentaire.
La méthode carte convertit chaque élément de la source CA dans un seul élément de la suite CA par application d'une fonction. mapPartitions convertit chaque partition de la source de RDD en plusieurs éléments de la suite (éventuellement aucun).
Ni, flatMap fonctionne sur un seul élément (comme
map
) et produit plusieurs éléments de la suite (commemapPartitions
).map
etflatMap
ont exactement les mêmes partitions que le parent.map
prend essentiellement en fonction de votref
, et passe dansiter.map(f)
. Donc, fondamentalement, de son une méthode de convenance qui s'enroulemapPartitions
. Je serais surpris s'il y avait un avantage de performance de toute façon pour un pur style de plan de transformation d'emploi (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 alorsmapPartitions
serait avantageux.Imp. ASTUCE :
Oui. voir l'exemple 2 de
flatmap
.. son auto-explicatif.Exemple de Scénario : si nous avons 100 K éléments dans un
RDD
partition, puis nous mettrons le feu au large de la fonction en cours d'utilisation par la cartographie de la transformation de 100K fois lorsque nous utilisonsmap
.À l'inverse, si nous utilisons
mapPartitions
alors nous ne appel à une fonction particulière d'un moment, mais nous allons passer dans tous les 100K dossiers et obtenir toutes les réponses en un seul appel de fonction.Il y aura gain de performance depuis
map
travaille sur une fonction en particulier de nombreuses fois, en particulier si la fonction est en train de faire quelque chose de cher à chaque fois qu'il n'aurait pas besoin de le faire si nous avons passé dans tous les éléments à la fois(dans le cas demappartitions
).carte
Exemple :
mapPartitions
Exemple 1
Exemple 2
Le programme ci-dessus peut également être écrite à l'aide de flatMap comme suit.
Exemple 2 en utilisant flatmap
Conclusion :
mapPartitions
transformation est plus rapide quemap
depuis il appelle votre fonction une fois la partition/, pas une seule fois/élément..Pour en savoir plus : foreach Vs foreachPartitions Quand utiliser Quoi?
map
oumapPartitions
pour obtenir le même résultat (voir les deux exemples dans la question); cette question est au sujet de pourquoi vous auriez du choisir une voie sur l'autre. Les commentaires dans les autres réponses sont vraiment utiles! Aussi, vous n'avez pas mentionné quemap
etflatMap
passerfalse
àpreservesPartitioning
, et quelles sont les implications de ce sont.map
est mieux quemapPartitions
? SimapPartitions
est si bon, pourquoi n'est-il pas la valeur par défaut de la carte de mise en œuvre?Carte :
MapPartitions