2016-11-15 3 views
0

DocsRDD:RDD [x: Vector [Zeichenfolge]] zu RDD [x: Vector [String] + Iterator: Vector [Zeichenfolge]]

RDD[Vector[String]] 

DocsRDD:

Vector(Doc1.txt, Doc2.txt, Doc5.txt) 
Vector(Doc4.txt, Doc3.txt) 
Vector(Doc6.txt, Doc9.txt) 

Was ich will, alle ist nur die Dual-Paare von Dokumenten, zum Beispiel für DocsRDD ich will

AllDualDocsRDD:

Vector(Doc1.txt, Doc2.txt) 
Vector(Doc1.txt, Doc5.txt) 
Vector(Doc2.txt, Doc5.txt) 
Vector(Doc4.txt, Doc3.txt) 
Vector(Doc6.txt, Doc9.txt) 

Unten ist ein Beispiel meines Codes (Ich bin neu bei Spark, Scala).

val AllDualDocsRDD = DocsRDD.map(e => if (e.size > 2) { 
          val V_iter = (1 to e.size).flatMap(e.combinations).filter(_.size == 2).toVector 
          V_iter.foreach(println) 
          //Here I Cannot put V_iter : scala.Vector[Vector[String]] 
         } 
         else e) 

Aber es scheint, dass ich die Wand getroffen habe! Weiß jemand wie ich das erreichen kann?

Antwort

0

Versuchen:

sc.parallelize(
    Seq(Vector("Doc1.txt", "Doc2.txt", "Doc5.txt")) 
).flatMap(v => v.combinations(Math.min(v.size, 2))) 
0

Wie über eine direkte flatmap auf dem RDD wie folgt aus:

val AllDualDocsRDD = DocsRDD.flatMap( x => { 
            if(x.size > 2){ 
              x.combinations(2).toSeq 
             } 
            else Seq(x) 
            } 
          ) 

Dies macht die Arbeit.