如何将字符串数组更改为双精度数组?

时间:2017-06-28 15:06:39

标签: scala apache-spark apache-spark-sql

我这样做如下:

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字符串数组更改为array的{​​{1}}(我可以在double函数中使用)?

我尝试了以下操作,但它不能用作字符串数组。

Vectors.dense

1 个答案:

答案 0 :(得分:0)

假设您有以下trainingData

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

trainingData包含doublesArray[String]列,您希望将其映射到Array[Double]

我要做的是采用单个doubles列(可能带有其他标识符列)并使用Spark的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的{​​{1}}。