2017-09-25 130 views
1

我是Spark新手,正在嘗試在scala中編寫代碼。我有一個RDD其由數據的形式:循環內火花RDD過濾器

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

和形式的另一列表[1,4,8,9]

我需要過濾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方法。此外,我想你想l(1),不l(0)第二檢查:

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

對於-理解沒有yield不......嗯...... :)產量,但 你並不真的需要換理解(或者就此而言,任何「循環」)。

事情是這樣的:

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

應該這樣做。