2017-12-03 271 views
1

我無法找到答案。 如果我有RDDpyspark:按值將單個RDD分割爲多個RDD

rdd = sc.parallelize([('a', [1,2,3]), ('b',[4,5,6])]) 

其中每個值都是一個列表。 有沒有方法可以拆分RDD,使得它成爲

sc.parallelize([('a',1),('a',2),('a',3),('b',4),('b',5),('b'6)]) 

現在在哪裏每個值是列表的元素之一,搭配的關鍵。 我大致知道解決方案。我們可以先collect()

a = rdd.collect() 

,並重新分配一個RDD作爲

rdd2 = sc.parallelize([x for x in a]) 

但如果RDD巨大,collect()會非常耗時。我們必須按比例考慮它。有沒有分散的方式來做到這一點? (如使用lambda function ..等)謝謝!

回答

2

它是flatMap任務:

rdd.flatMap(lambda x: [(x[0], v) for v in x[1]]).collect() 
# [('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5), ('b', 6)] 

這裏lambda函數需要從原來的RDD一個鍵值對和地圖的關鍵,每個單獨的值:

lamb = lambda x: [(x[0], v) for v in x[1]] 

lamb(('a', [1,2,3])) 
# [('a', 1), ('a', 2), ('a', 3)] 

flatMap將該操作映射到每個鍵值對並將結果展平。

+1

謝謝!這正是我需要的! – Hsiang