2016-07-08 31 views
6

aşağıdaki işlemleri gerçekleştirir: Bu sarılı diziyi sürekli tekrarlanması veya bir liste halinde bu dönüştürebilirim nasılScala wrappedArray nasıl yinelenir? (Kıvılcım)

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)) 

Sorum şu. ListDocs için aldığım seçenekler şunlardır: applyasInstanceOfcloneisInstanceOflengthtoStringupdate Nasıl devam ederim?

cevap

6

Bunu çözmenin bir yolu. Şimdi ** val arrDocs = listDocs (0) val sıcaklığı = arrDocs.asInstanceOf [mutable.WrappedArray [Uzun]] ** sıcaklığı:

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

Aslında bu yaptım ve bu benim olayı çözmek gibi görünüyor temelde bana bir yineleyici verir. – boY

+0

teşekkürler @boY, cevabı güncelledim. Bir önceki biraz verbose oldu. –

+0

Kodumda WrappedArray ile ilgili sorunlar yaşadım ve bunu Seq [Int] ile değiştirebiliyordum. – jspooner