2015-11-06 13 views
0

我有以下形式的RDD:提取一個元組在Python中的星火

(2, [hello, hi, how, are, you])

我需要映射這些元組,如:

((2,hello), (2, hi), (2, how), ((2, are), (2, you))

我想這在python:

PairRDD = rdd.flatMap(lambda (k,v): v.split(',')).map(lambda x: (k,x)).reduceByKey()) 

這不會工作,因爲我沒有在地圖轉換k。我不知道該怎麼做?任何意見 ?

感謝您提前。

回答

2

我認爲你的核心問題是錯位的右派。考慮下面的代碼(我測試過在斯卡拉相當,但它應該工作在pySpark方法相同):

PairRDD = rdd.flatMap(lambda (k,v): v.split(',').map(lambda x: (k,x))) 

v被分成一個字符串列表,然後該列表被映射到一個元組(key,string),然後該列表返回到flatMap,並將其分成RDD中的多行。使用v.split(',')之後的附加右側零件,您丟掉了鑰匙(因爲您只返回了一串字符串)。

原始數據集中唯一的關鍵值是什麼?如果是這樣,你想要一個元組列表,然後使用map而不是flatMap,你會得到你想要的而沒有洗牌。如果您確實想要合併原始數據集中的多行,則會調用groupByKey,而不是reduceByKey。我也很好奇,如果拆分是必要的 - 你的元組(Int,String)還是(Int,List(String))?

+0

是的,我做錯了。現在通過適當地放置正確的parens我可以得到(鍵,值)對中的值。我的RDD在這裏是一個拉鍊式RDD,在壓縮右邊部分之前是一個列表。我檢查了它的類型。 但現在拉鍊後,並妥善放置支架。我可以訪問關鍵值。但不知何故,它會產生錯誤,因爲在做v.split(',')時列表不是迭代的。非常感謝Matthew的幫助。 – rahul

+0

@rahul如果這是一個列表,你不需要做'拆分';你應該可以做'v.map(lambda x:(k,x))',因爲'split'是一個將字符串轉換成列表的函數,'map'是列表的函數(和其他類似的對象)。 –

+0

好的..我做到了。所以我的代碼看起來像這樣:PairRDD = rdd.flatMap(lambda(k,v):v.map(lambda x:(k,x))。但它給我錯誤,因爲列表對象沒有屬性映射 – rahul