2016-11-06 35 views
0

我在pyspark的關鍵價值地圖上苦於基本操作。以下是問題描述:如何根據鍵值映射中兩個不同鍵的條件組合值?

data = {(1, [2, 3, 4]), (2, [a, b, 3]), (3, [x, y]) } 

我想獲取所有未包含在當前值列表中的鍵的值。結果應該是這樣的:

data = {(1, [a, b, x, y]), (2, [x, y]), (3, []) } 

之前甚至過濾的結果,我只是想價值觀結合起來,有幾個方法:

  1. 將數據發送到一個功能,並創建嵌套的循環轉換成數據:失敗,因爲我不能讓我的RDDS使用地圖通過數據迭代正常
  2. 迭代:data.map(lambda x: (x[0], x[1].map(lambda a,b: (x[a] + x[b])))):失敗,因爲該名單沒有mapflatMap屬性
  3. 利用價值圖法:data.flatMapValues(lambda a, b: (data.lookup(a) + data.lookup(b))).

順便說一句,我是完全新的pyspark所以我的方法可能是天真的,但有沒有辦法讓這些工作還是有,我應該使用不同的方法?

回答

1

我想你想要做的事,如下列:

1)收集的所有值(假設他們會存放在內存如果沒有,我不得不想更多):

values = (data.mapValues(lambda x: set(x)) 
       .values() 
       .reduce(lambda x, y: x.union(y)) 
       .collect()) 

2)(大概在值廣播值)地圖與您的最終名單,結束後

data.mapValues(lambda x: [y for y in values if y not in x]) 

Iterate through data using map: data.map(lambda x: (x[0], x[1].map(lambda a,b: (x[a] + x[b])))): failed as the list doesn't have map or flatMap attributes

關於這一點的簡要說明。你想Python bultin map。語法是map(function, sequence)

+0

感謝您的回覆!我試過你的方法,看來set對象沒有屬性collect:AttributeError:'set'對象沒有屬性'collect'。有沒有其他方法可以打印出我們的價值?另外,第二個也有類似的問題,我遇到過:f(self,obj)#使用明確的自我調用未綁定方法 「看起來您正試圖廣播RDD或引用RDD」 – shake

+0

如果我這樣做:values2 = sc.broadcast(values)和data.mapValues(lambda x:[y for y in values in if if y not in x])。collect()。我收到一個錯誤,說明廣播對象不可迭代。 – shake

+0

糟糕...你可以跳過「收集」步驟 - 減少照顧它。 檢查文檔,但我認爲它應該是'values2.value'來訪問廣播變量的實際值(也許我不應該稱它爲值...)。 – hoyland