我有一個非常簡單的代碼:RDD創建和變量綁定
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)]
這令人困惑,至少可以說。
看來,由於RDDS,正被用於創建RDDS的i
值的惰性計算是一個當collect()
把它叫做熊,這是1(從for
循環的最後運行)。
現在,元組的兩個元素都來自i
。
但似乎,對於元組的第一個元素,i
熊值0和1倍,而對於元組i
的第二個元素承載值2
有人能請解釋一下發生了什麼?
感謝。
因此'i = i'將'i'推入到lambda函數的範圍中,當它被調用時,lambda函數的本地值將首先被訪問。 – MYGz
@MohammadYusufGhazi是的。缺省值在定義範圍內的函數定義處計算 –
由range(2)創建的'list'中的'0'和'1'整數對象的id被分配給lambda函數參數。該列表不會被垃圾回收,因爲其中的項目仍然被其他一些變量指向? – MYGz