2017-09-25 12 views
1

私はSparkを初めて使用しており、scalaでコードを作成しようとしています。スパークRDDフィルタ内のループ

1: 2 3 5 
2: 5 6 7 
3: 1 8 9 
4: 1 2 4

、フォーム内の別のリスト[1,4,8,9]

私はそれがこれらのラインを取るように、RDDをフィルタリングする必要があります。私は、フォーム内のデータから成るRDDを有します':'の前の値がリストに存在するか、または ':'の後のいずれかの値がリストに存在するかのいずれかです。

私は、次のコードを書かれている:

val links = linksFile.filter(t => { 
         val l = t.split(": ") 
         root.contains(l(0).toInt) || 
         for(x<-l(0).split(" ")){ 
          root.contains(x.toInt) 
         } 
        }) 

linksFileはRDDで、根がリストです。

しかし、これは機能しません。助言がありますか??

答えて

1

あなたはクローズしています。forループは、実際にはその内部で計算された値を使用しません。代わりにexistsメソッドを使用する必要があります。 yieldない...よく...利回り:) なしの場合、理解

val links = linksFile.filter(t => { 
         val l = t.split(": ") 
         root.contains(l(0).toInt) || 
         l(1).split(" ").exists { x => 
          root.contains(x.toInt) 
         } 
        }) 
+0

これは機能します。ありがとう!! – NikhilaR

0

しかし、あなたは本当にFOR-必要はありません。また、私はあなたが第2のチェックのためにl(1)、ないl(0)をしたいと思います理解(またはその問題のための任意の "ループ")ここで。このような

何か:

linksFile.map(
    _.split(": ").map(_.toInt) 
).filter(_.exits(list.toSet)) 
    .map(_.mkString) 

はそれを行う必要があります。