2016-08-18 23 views
1

所以我RDD由數據看起來像:創建與現有的鍵值列表的組合 - Pyspark

(k, [v1,v2,v3...]) 

我想創建一個價值部分的所有套二的組合。

所以最終圖應該是這樣的:

(k1, (v1,v2)) 
(k1, (v1,v3)) 
(k1, (v2,v3)) 

我知道得到的價值的一部分,我會使用類似

rdd.cartesian(rdd).filter(case (a,b) => a < b) 

然而,這需要傳遞整個RDD(對吧?)不只是價值的一部分。我不確定如何達到我想要的目的,我懷疑它是一個羣體。

而且,最終,我想要得到的K,V看起來就像

((k1,v1,v2),1) 

我知道如何從我所期待的該得到的,但也許它更容易直來直去那裏?

謝謝。

+0

歡迎使用計算器。請格式化您的問題,擺脫縮寫,並[讀這篇文檔](http://stackoverflow.com/help/how-to-ask)。這會讓你的問題對未來的讀者有用。 –

回答

2

我認爲以色列的答案是不完整的,所以我走了一步。

import itertools 

a = sc.parallelize([ 
    (1, [1,2,3,4]), 
    (2, [3,4,5,6]), 
    (3, [-1,2,3,4]) 
    ]) 

def combinations(row): 
    l = row[1] 
    k = row[0] 
    return [(k, v) for v in itertools.combinations(l, 2)] 

a.map(combinations).flatMap(lambda x: x).take(3) 
# [(1, (1, 2)), (1, (1, 3)), (1, (1, 4))] 
+0

是的,我確實必須自己將其平面圖以將其轉換爲最終所需的格式 – tormond

1

使用itertools來創建組合。這裏是一個演示:

import itertools 

k, v1, v2, v3 = 'k1 v1 v2 v3'.split() 

a = (k, [v1,v2,v3]) 

b = itertools.combinations(a[1], 2) 
data = [(k, pair) for pair in b] 

data將是:

[('k1', ('v1', 'v2')), ('k1', ('v1', 'v3')), ('k1', ('v2', 'v3'))] 
+0

因此,在pyspark中,我需要創建另一個功能來執行此操作?因爲我不知道如何鏈接。我想過創建一個函數,然後導入它,看起來像這樣。我不知道是否有一種原生的方式通過預建功能來完成。 – tormond

+0

您可以創建一個接收k和一個v列表的函數,並返回數據,如我的回答 –

+1

謝謝!得到這個工作和學習,我可以將一個函數粘貼到pyspark! – tormond