2017-01-06 51 views
-1

我是Spark的新手,我仍然試圖圍繞它的一些概念進行思考。 所以,我有一個鍵值元組列表,其中鍵和值都是元組。Python Spark reduceByKey不適用於單個元素

val = [ 
    ((18, 13), (1, 1193, **5, 1**)), 
    ((18, 13), (1, 661, **3, 1**)), 
    ((9, 15), (1, 914, **3, 1**)) 
] 

在值元組中,我對最後兩個元素感興趣(用粗體表示)。

我希望執行以下操作:5 + 3和1 + 1,因爲它們的元組共享一個公共密鑰(18,13),而最後一個元組的值爲3和1應該保持不變。 要做到這一點,我做了以下內容:

parsed_data = sc.parallelize(val) 
result = parsed_data.reduceByKey(lambda x,y: (x[2]+y[2], x[3]+y[3])) 

應用這些reduceByKey後,我已經得到了以下結果:

[((18, 13), (8, 2)), ((9, 15), (1, 914, 3, 1))] 

的reduceByKey功能沒有被應用到最後的元組,因爲它沒有一對減少。現在我想明白,我怎麼能反正應用reducebyKey,得到以下的輸出:

[((18, 13), (8, 2)), ((9, 15), (3, 1))] 

回答

3

最簡單的這裏可能只是將值映射事先:

parsed_data.mapValues(lambda x: (x[2], x[3])).reduceByKey(lambda x,y: (x[0]+y[0], x[1]+y[1])) 

(道歉,如果在語法是錯誤的,我是一個斯卡拉的傢伙,而不是一個Python傢伙)。