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.