2016-11-18 74 views
1

我在項目中使用python3時遇到了一個問題。在鍵值對中,如('1','+1 2,3')"2,3"部分是我想檢查的內容。所以我寫了下面的代碼:
(假設這個鍵值對保存在一個RDD稱爲P_LIST)我如何在火花中使用「for」循環與pyspark


def add_label(x): 
    label=x[1].split()[0] 
    value=x[1].split()[1].split(",") 
    for i in value:  
     return (i,label) 
p_list=p_list.map(add_label) 

做的那樣,我只能得到結果:('2','+1')它應該是('2','+1')('3','+1')。看起來,地圖操作中的「for」循環只做了一次。我怎麼能讓它做多次?或者還有什麼其他的方式可以用來實現像地圖操作或減少操作中的「for」循環這樣的函數?

我想提一下,我真正處理的是一個大型數據集。所以我必須使用AWS羣集並實現並行化的循環。集羣中的從節點似乎不瞭解該循環。我如何讓他們知道使用Spark RDD功能?或者如何以另一種流水線方式(這是Spark RDD的主要設計之一)進行這樣的循環操作?

+0

我很想從這個問題中刪除火花標籤,因爲除了'RDD.map'功能之外,沒有任何關於這個的火花特定 –

+0

抱歉沒有提及我的項目的細節。這真的是一個火花應用程序。上面的問題只是我遇到的主要問題的一個摘要。會有一堆鍵值對,如('1','+ 1 2,3'),保存在rdd中。我需要比較標籤和以下子節點,並返回所有鍵 - 值對的每個(子節點,標籤)。整個操作可能是RDD.map()。filter()。reduceByKey()等。它應該使用Spark集羣在AWS上完成。 – Linghao

+0

你嘗試過'rdd.foreach()'嗎? – Kristian

回答

0

你的return語句不能在循環中;否則,它在第一次迭代之後返回,永遠不會進行第二次迭代。

什麼,你可以嘗試是這樣的

result = [] 
for i in value: 
    result.append((i,label)) 
return result 

然後result將所有的循環中創建的元組的列表。

+0

我明白了你的觀點,並會嘗試使用rdd.flatMap()將rdd中每個元素的結果列表展平。謝謝。 – Linghao