2 votes

Différence entre RDD.foreach() et RDD.map()

Je suis en train d'apprendre Spark en Python et je me demande si quelqu'un peut m'expliquer la différence entre l'action foreach() et transformation map() ?

rdd.map() renvoie un nouveau RDD, comme la fonction map originale de Python. Cependant, je veux voir un rdd.foreach() et comprendre les différences. Merci de votre compréhension.

4voto

Oliver Dain Points 4455

Un exemple très simple serait rdd.foreach(print) qui imprimerait la valeur de chaque ligne du RDD mais ne modifierait en rien le RDD.

Par exemple, cela produit un RDD avec les nombres 1 - 10 :

>>> rdd = sc.parallelize(xrange(0, 10)).map(lambda x: x + 1)
>>> rdd.take(10)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

En map a calculé une nouvelle valeur pour chaque ligne et il l'a renvoyée afin d'obtenir un nouveau RDD. Cependant, si j'utilise foreach cela ne servirait à rien car foreach ne modifie en aucune façon l'indice de référence :

>>> rdd = sc.parallelize(range(0, 10)).foreach(lambda x: x + 1)
>>> type(rdd)
<class 'NoneType'>

Inversement, l'appel à map sur une fonction qui renvoie None comme print n'est pas très utile :

>>> rdd = sc.parallelize(range(0, 10)).map(print)
>>> rdd.take(10)
0
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None, None]

En print retour d'appel None donc la cartographie ne donne qu'un tas d'informations sur l'état de l'environnement. None et vous ne vouliez pas de ces valeurs et vous ne vouliez pas les sauvegarder, donc les renvoyer est un gaspillage. (Notez les lignes avec 1 , 2 etc. sont les print en cours d'exécution et ils n'apparaissent pas tant que vous n'avez pas appelé take puisque le RDD est exécuté paresseusement. Cependant, le contenu de la RDD ne sont qu'un ensemble de None .

Plus simplement, appelez map si vous vous intéressez à la valeur de retour de la fonction. Appeler foreach si vous ne le faites pas.

1voto

xmorera Points 394

Map est une transformation, donc lorsque vous effectuez un map, vous appliquez une fonction à chaque élément du RDD et vous renvoyez un nouveau RDD où d'autres transformations ou actions peuvent être appelées.

Foreach est une action, il prend chaque élément et applique une fonction, mais il ne renvoie pas de valeur. Ceci est particulièrement utile lorsque vous devez effectuer un calcul sur un RDD et enregistrer le résultat ailleurs, par exemple dans une base de données ou appeler une API REST avec chaque élément du RDD.

Supposons par exemple que vous ayez un RDD contenant de nombreuses requêtes que vous souhaitez enregistrer dans un autre système. Les requêtes sont stockées dans un RDD.

queries = <code to load queries or a transformation that was applied on other RDDs>

Vous souhaitez ensuite enregistrer ces requêtes dans un autre système par le biais d'un appel à une autre API

import urllib2

def log_search(q):
    response = urllib2.urlopen('http://www.bigdatainc.org/save_query/' + q)

queries.foreach(call_search)

Vous avez maintenant exécuté la requête log_query sur chaque élément du RDD. Si vous aviez fait un map, rien ne se serait encore passé, jusqu'à ce que vous appeliez une action.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X