2017-06-28 5 views
1

Ich tue dies wie folgt:Wie ändert man das Array von Strings in Double-Arrays?

val trainVector = trainingData. 
    rdd. 
    map { r => Vectors.dense(
       r.getDouble(4), 
       r.getDouble(37), 
       r.getAs(_).toDouble(70).toArray, 
       r.getAs(_).toDouble(76).toArray)) 

ich die folgende Störung erhalte:

<console>:22: error: missing parameter type for expanded function ((x$1) => r.getAs(x$1).toDouble(70).toArray) 

Wie kann ich r.getAs(_).toDouble(70).toArray und r.getAs(_).toDouble(76).toArray Arrays von Strings in array von double ändern (das ich in kann Vectors.dense Funktion)?

Ich habe Folgendes versucht, aber es funktioniert nicht als Array der Zeichenfolge.

r.getAs[Array[Double]](70) 
+0

versuchen Sie 'val trainVector = df.rdd.map (r => Vektoren.dense (r.getDouble (4) .asInstanceOf [Array [Doppel]] ++ r.getDouble (37) .asInstanceOf [Array [Double] ] ++ r.getAs [Array [Doppelt]] (70) ++ r.getAs [Array [Double]] (76))) ' –

Antwort

0

Nehmen wir an, Sie haben folgende trainingData.

val trainingData = Seq(Array("1.1")).toDF("doubles") 
scala> trainingData.printSchema 
root 
|-- doubles: array (nullable = true) 
| |-- element: string (containsNull = true) 

trainingData enthält eine einzelne doubles Spalte vom Typ Array[String], die Sie zur Karte über Array[Double] möchten.

Was ich tun würde wäre, dass einzelne doubles Spalt zu nehmen (möglicherweise mit einer anderen ID-Spalte) und map Operator mit Scala Spark map Funktion nach innen.

val doubles = trainingData. 
    select("doubles"). 
    as[Array[String]]. 
    map { strs => strs.map(_.toDouble) } 
scala> doubles.printSchema 
root 
|-- value: array (nullable = true) 
| |-- element: double (containsNull = false) 

Ich denke aber, dass es, da Sie die Doppel zu VectorUDF verwandeln müssen nicht am Ende arbeiten, die ein private[spark] ist.

Verwandte Themen