2016-08-18 6 views
1

は、だから私のRDDは次のように見ているデータで構成されています。作成組み合わせPyspark

だから、エンドマップは次のようになります。私は値の一部を取得するために知って

(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

ようこそstackoverflow。あなたの質問を書式化し、略語を取り除き、[この文書を読む](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