2017-09-15 148 views
0

讓我們假設,我在Spark中有一個關鍵值對,如下所示。Pyspark(key,value)對與(key,[值列表])

[ (Key1, Value1), (Key1, Value2), (Key1, Vaue3), (Key2, Value4), (Key2, Value5) ] 

現在我想減少這種情況,像這樣。

[ (Key1, [Value1, Value2, Value3]), (Key2, [Value4, Value5]) ] 

也就是說,從鍵值到鍵值列表。

我該怎麼做,使用地圖和減少python函數?

+3

我相信這是你正在尋找的:https://stackoverflow.com/a/27002657/8160718 –

回答

-1

這樣做與mapreduce肯定是可能的,但肯定是一個混淆練習。做重複很容易:

lists={}  # key -> list of values 
output=[] 
for k,v in input: 
    l=lists.get(k) 
    if l is None: 
    l=lists[k]=[] 
    output.append((k,l)) # empty for now 
    l.append(v) 

說明(因爲它是很難得到的只是從一個單一的例子要求):

  1. 這假定鍵是hashable
  2. 它支持像[(k1,v1),(k2,v2),(k1,v3)]這樣的列表,其中並非所有​​對都相鄰。
  3. 它按照第一次出現的順序將密鑰放入output列表中。
  4. 它將所有值(包括重複項)按其出現的順序排列。
+0

這個代碼是不適合大量的鍵,值對,因爲你將遍歷所有的他們。 –

+0

我不是'pyspark'的專家。我是否應該假設該算法是[在線](https://en.wikipedia.org/wiki/Online_algorithm)? (在Python 2中,'map'和'reduce'不能做到這一點!)如果是這樣,我們可以假設所有具有單個鍵的對都是連續的嗎? –

+2

我並不是故意粗魯。我想說的是,在考慮與Spark有關的問題時,數據集通常很大,並且當您執行上面編寫的代碼時,它需要調用collect(),以便主節點將需要將所有內容加載到它的內存中是不可行的。 OP意味着Pyspark中的「map」和「reduce」,而不是Python中使用的那些。 –

相關問題