2017-06-28 88 views
1

我下面這樣:如何將字符串數組更改爲雙精度數組?

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

我收到以下錯誤:

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

我怎樣才能改變字符串r.getAs(_).toDouble(70).toArrayr.getAs(_).toDouble(76).toArray陣列成doublearray(我可以在使用Vectors.dense函數)?

我嘗試了以下,但它不起作用,因爲它的字符串數組。

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

嘗試'val trainVector = df.rdd.map(r => Vectors.dense(r.getDouble(4).asInstanceOf [Array [Double]] ++ r.getDouble(37).asInstanceOf [Array [Double] ] ++ r.getAs [Array [Double]](70)++ r.getAs [Array [Double]](76))) ' –

回答

0

讓我們假設你有以下trainingData

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

trainingData包含Array[String]類型,你想映射到Array[Double]doubles列。

我會做什麼將採取單doubles列(可能有一些其他的標識符列),並使用星火的map運營商,Scala的內部map功能。

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) 

我覺得然而,到底它不會工作,因爲你必須雙打轉化爲VectorUDF這是一個private[spark]

相關問題