好吧,元組不能轉為字典。或者說直接不能轉,間接可以。當然元組有格式要求的。
[(key1,value1),(key2,value2),...]
之所以把這個問題拋出來是因為,spark的zipWithIndex本來應返回字典,但卻返回了上面這種格式。
當然在spark的環境下它還是可以被當做字典支持的。你可以用lookup函數。
然而,lookup函數式不能傳到rdd的一些操作的lambda表達式的,例如:
#一個錯誤的例子
sholdbedict = sc.parallelize([4,5,6]).zipWithIndex()
sholdbedict.collect()#輸出[(4, 0), (5, 1), (6, 2)]
sholdbedict.lookup(6)#也沒錯
just4test = sc.parallelize([6,4,6])
just4test.map(lambda _: sholdbedict.lookup(_))#返回每個元素的編號,報錯了
#結束一個錯誤的例子
因為lookup不能傳到RDD.map函數里。其它的也不行。
所以,我們需要把剛才生成的rdd保存到一個rdd之外的變量里。而且這個變量最好是一個字典。
實現這個效果的方法有多種,在這里,我是使用一個reduce函數完成這件事的。
def tu2dic(a,b): if type(a)==type((1,2)): res={a[0]:a[1]} else: res=a; if type(b)==type((1,2)): res[b[0]]=b[1] else: res.update(b) return res
這里定義的是一會兒要用到的函數
sholdbedict = sc.parallelize([4,5,6]).zipWithIndex().reduce(tu2dic)#輸出了一個字典
just4test.map(lambda _: sholdbedict[_]).collect()#得到了正確的結果[2,0,2]
~~~~~~~~~~本~~~節~~~完~~~~~~~~~~
PS:這個東西在看那本spark機器學習的書的時候或許有用。
歡迎補充更方便的方法。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好吧,真的有其它的方法,rdd的collectAsMap函數有類似的功能。