2016-05-02 26 views
1

我有由鍵和值列表組成的數據。 RDD =(鍵,[超值])Spark:如何在map(python)中生成多個元素?

什麼,我想要的是:

rdd.map(lambda pair: func(pair)) 

其中函數返回若干(價值NEW_VALUE)的一對。請注意,New_value也取決於Key!

所以,簡單地說,在

(key1, [Value1, Value2]) 
(key2, [Value3, Value4, Value5]) 

使用.map()後,我想收到:

(Value1, NewValue1) 
(Value2, NewValue2) 
(Value3, NewValue3) 
(Value4, NewValue4) 
(Value5, NewValue5) 

我怎樣才能使它在PySpark?

+0

使用列表解析代替@ cricket_007溶液,如'[FUNC(一對),用於對RDD]' – Natecat

回答

1

讓func成爲連接的鍵值。

def func(kv): 
    return '-'.join(kv) 

你想所有列表拉平至(鍵,值)對

rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1])) 

然後映射在所有對func同時保持初始值作爲結果

map(lambda kv: (kv[1], func(kv))) 
的一部分

總之,

rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1])).map(lambda kv: (kv[1], func(kv))) 

實施例

>>> rdd = sc.parallelize([('k1', ['v1', 'v2']), ('k2', ['v3','v4','v5'])]) 
>>> rdd.flatMap(lambda kv: ((kv[0], v) for v in kv[1])).map(lambda kv: (kv[1], func(kv))).collect() 
[('v1', 'k1-v1'), 
('v2', 'k1-v2'), 
('v3', 'k2-v3'), 
('v4', 'k2-v4'), 
('v5', 'k2-v5')] 
+0

對不起。忘了提及,NewValues也取決於Key。有問題添加了這些信息。 – Acapello

+0

啊,知道了。查看更新回答 –

+0

謝謝。但是,我發現了另一種解決方案,你可以檢查它:) – Acapello

0

我找到不同的使用yield

>>> rdd = sc.parallelize([('k1', ['v1', 'v2']), ('k2', ['v3','v4','v5'])]) 
>>> def func(kv): 
...  for v in kv[1]: 
...   yield (v, kv[0] + '-' + v) 
>>>rdd.flatMap(lambda kv: func(kv)).collect() 
[('v1', 'k1-v1'), 
('v2', 'k1-v2'), 
('v3', 'k2-v3'), 
('v4', 'k2-v4'), 
('v5', 'k2-v5')] 
+0

這不是代碼輸出的內容。它輸出'['k1-v1','k1-v2','k2-v3','k2-v4','k2-v5']' –

+0

@ cricket_007是的,應該是'yield(v,kv [0 ] +' - '+ v)' – Acapello

相關問題