2016-07-08 12 views
6

I führt die folgenden Operationen:Wie scala wrappedArray iterieren? (Funke)

val tempDict = sqlContext.sql("select words.pName_token,collect_set(words.pID) as docids 
           from words 
           group by words.pName_token").toDF() 

val wordDocs = tempDict.filter(newDict("pName_token")===word) 

val listDocs = wordDocs.map(t => t(1)).collect() 

listDocs: Array 

[Any] = Array(WrappedArray(123, 234, 205876618, 456)) 

Meine Frage ist, wie kann ich über diese gewickelten Array iterieren oder diese in eine Liste konvertieren. Die Optionen, die ich für den listDocs bekommen sind: applyasInstanceOfcloneisInstanceOflengthtoStringupdate Wie gehe ich vor?

Antwort

6

Hier ist eine Möglichkeit, dies zu lösen.

import org.apache.spark.sql.Row 
import org.apache.spark.sql.functions._ 
import scala.collection.mutable.WrappedArray 

val data = Seq((Seq(1,2,3),Seq(4,5,6),Seq(7,8,9))) 
val df = sqlContext.createDataFrame(data) 
val first = df.first 

// use a pattern match to deferral the type 
val mapped = first.getAs[WrappedArray[Int]](0) 

// now we can use it like normal collection 
mapped.mkString("\n") 

// get rows where has array 
val rows = df.collect.map { 
    case Row(a: Seq[Any], b: Seq[Any], c: Seq[Any]) => 
     (a, b, c) 
} 
rows.mkString("\n") 
+0

Eigentlich tat ich dies und das scheint mein Fall zu lösen: val arrDocs = listDocs (0) val temp = arrDocs.asInstanceOf [mutable.WrappedArray [Long]] Der ** ** Temp jetzt Im Grunde gibt es mir einen Iterator. – boY

+0

danke @boY, ich habe die Antwort aktualisiert. Der vorherige war etwas ausführlich. –

+0

Ich hatte Probleme mit WrappedArray in meinem Code und konnte es durch Seq [Int] ersetzen. – jspooner