spark元組的列表轉化為字典


好吧,元組不能轉為字典。或者說直接不能轉,間接可以。當然元組有格式要求的。

[(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函數有類似的功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM