Я собираюсь принять следующую схему для training
:
id:Integer
features: Array[Double]
Попробуйте: val df = training.map(r => (Vectors.dense(r.getAs[Seq[Double]]("features").toArray),r.getAs[Integer]("id"))).toDF("features","id")
Наборы данных для внутреннего хранения Array
объекты WrappedArray
, быстрый Вступление которого можно найти здесь.
Массив против обернутого массива
Итак, вы должны "извлечь" ваш array
из doubles
, приведя его к Seq[Double]
вместо Array[Double]
. Однако для метода dense
необходимо Array[Double]
. Итак, преобразуйте Seq[Double]
в Array[Double]
, используя метод toArray
.
val training = List((Seq(0.0,0.0),2),(Seq(1.0,1.0),5)).toDF("features","id")
training.show
+----------+---+
| features| id|
+----------+---+
|[0.0, 0.0]| 2|
|[1.0, 1.0]| 5|
+----------+---+
training: org.apache.spark.sql.DataFrame = [features: array<double>, id: int]
val df = training.map(r => (Vectors.dense(r.getAs[Seq[Double]]("training").toArray),r.getAs[Integer]("id"))).toDF("features","id")
df.show
+---------+---+
| features| id|
+---------+---+
|[0.0,0.0]| 2|
|[1.0,1.0]| 5|
+---------+---+
df: org.apache.spark.sql.DataFrame = [features: vector, id: int]
Надеюсь, это поможет.