2017-02-25 2 views
1

私はspaa/sparkを初めて使用しています。ペアのリストからトリプルのすべてのサブセットがペアのリストに存在するようなリストからトリプルのリストを作成する

私は、次の形式のRDDを持っている:

//user_freq_pair : (1,List((98,101), (98,100), (98,102), (100,101), (101,102))) 
scala> user_freq_pair 
res17: org.apache.spark.rdd.RDD[(Int, List[(Int, Int)])] 

私はダブルスからトリプルの新しいリストを計算したいが、トリプルのリストは、それがから我々元のリストに存在するサブセットだすべてを持っている必要があります計算している。したがって、ペアリストを単純に平坦化してからすべてのトリプルを生成することはできません。我々は可能な4つのトリプルからのみ、以下のトリプルを持つことになり、上記の例で

(。我々は(1,List(98,100,101,102) .NOを持っている平ら場合は4から3を選択する方法のは、4つの方法です):

//user_triple: (1,List((98,100,101)) because (98,101),(98,100),(100,101) all three are present in the original list 
scala> user_triple 
res18: org.apache.spark.rdd.RDD[(Int, List[(Int, Int,Int)])] 

私はRDDのための関数を書く方法と上記の課題を達成する方法がわかりません。

+0

List(98,101,102)も有効なトリプレットですか? –

+0

はい、ありがとうございました –

+0

List [List [Int]]の代わりにList [(Int、Int、Int)]を生成する方法 –

答えて

1

次の関数は、条件を満たす候補トリプレットを識別します。

def generateTriplets(input: List[(Int,Int)]) = { 
    val combinations = input.flatMap({case (x,y) => List(x,y)}).toSet.toList.combinations(3).toList 
    combinations collect { 
      case a::b::c::Nil if 
       (input.contains((a,b)) || input.contains((b,a))) && 
       (input.contains((b,c)) || input.contains((c,b))) && 
       (input.contains((a,c)) || input.contains((c,a))) => (a,b,c) 

    } 
} 

サンプル入力

scala> generateTriplets(List((98,101), (98,100), (98,102), (100,101), (101,102))) 
res37: List[List[Int]] = List(List(98, 101, 100), List(98, 101, 102)) 

あなたはその後、所望の出力を得るためにあなたのRDDにこの機能の上にマッピングすることができます。

+0

こんにちは、私たちは同じプロセスを3つの新しいペアのリストのためにしなければならない場合は、 'の組み合わせ(4)'を見つけてから再び4つのペアのリストを見つけて '{5}'を見つけてください関数を何度も何度も定義しなければなりません。より良い方法が実装されているので、私は数、List [(number pair)]を渡し、数字+ 1の組み合わせを見つけるだけです –

関連する問題