J'ai un code très simple:création RDD et variable de liaison
def fun(x, n):
return (x, n)
rdds = []
for i in range(2):
rdd = sc.parallelize(range(5*i, 5*(i+1)))
rdd = rdd.map(lambda x: fun(x, i))
rdds.append(rdd)
a = sc.union(rdds)
print a.collect()
je ne m'y attendais que la sortie soit la suivante:
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]
Cependant, la sortie est la suivante:
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]
C'est pour le moins déroutant.
Il semble, en raison de l'évaluation paresseuse de RDD, la valeur de i
qui est utilisé pour créer RDD est celui qu'il porte lorsque collect()
est appelé, qui est une (de la dernière exécution de la boucle for
).
Maintenant, les deux éléments du tuple sont dérivés de i
.
Mais il semble, pour le premier élément du tuple, i
ours valeurs 0 et 1, tandis que pour le second élément du tuple i
porte la valeur 2.
Quelqu'un peut-il expliquer s'il vous plaît ce qui se passe?
Merci.
Donc 'i = i' pousse' i' dans la portée de la fonction lambda et quand elle s'appelle la valeur locale de la fonction lambda sera accédée en premier. – MYGz
@MohammadYusufGhazi oui. Les valeurs par défaut sont évaluées au point de définition de la fonction dans la portée de définition –
L'identifiant des objets entiers '0' et' 1' dans la 'liste' créée par' range (2) 'est affecté aux arguments de la fonction lambda. Cette liste ne sera pas collectée parce que les éléments à l'intérieur sont encore pointés par d'autres variables? – MYGz