У меня есть очень простой код:создание РДД и переменной связывания
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()
я ожидал выход быть следующее:
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]
Однако вывод состоит в следующем:
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)]
Это смущает, если не сказать больше.
Кажется, из-за ленивые оценки РДА, значение i
, который используется для создания РДА является тот, когда он носит collect()
называется, что 1 (от последнего запуска цикла for
).
Теперь оба элемента кортежа состоят из i
.
Но, кажется, для первого элемента кортежа, i
медведей значения 0 и 1, а для второго элемента кортежа i
имеет значение 2.
Может кто-нибудь объяснить, что происходит?
Спасибо.
Таким образом, 'i = i' подталкивает' i' в область лямбда-функции и когда он называется локальным значением лямбда-функции, будет доступен в первую очередь. – MYGz
@MohammadYusufGhazi да. Значения по умолчанию оцениваются в точке определения функции в определяющей области. –
Идентификатор целых объектов '0' и' 1' в 'list', созданный' range (2) ', присваивается аргументам лямбда-функции. Этот список не будет собираться с мусором, потому что элементы внутри него все еще указывают некоторые другие переменные? – MYGz