Мне нужно преобразовать RDD в один столбец o.a.s.ml.linalg.Vector DataFrame, чтобы использовать алгоритмы ML, в частности K-Means для этого случая. Это мой РДД:
val parsedData = sc.textFile("/digits480x.csv").map(s => Row(org.apache.spark.mllib.linalg.Vectors.dense(s.split(',').slice(0,64).map(_.toDouble))))
Я попытался сделать то, что -column">этот ответ предполагает неудачу, я полагаю, потому что вы в конечном итоге получаете вектор MLlib, он выдает ошибку несоответствия при запуске алгоритма. Теперь, если я изменю это:
import org.apache.spark.mllib.linalg.{Vectors, VectorUDT}
val schema = new StructType()
.add("features", new VectorUDT())
к этому:
import org.apache.spark.ml.linalg.{Vectors, VectorUDT}
val parsedData = sc.textFile("/digits480x.csv").map(s => Row(org.apache.spark.ml.linalg.Vectors.dense(s.split(',').slice(0,64).map(_.toDouble))))
val schema = new StructType()
.add("features", new VectorUDT())
Я бы получил сообщение об ошибке, потому что ML VectorUDT является частным.
Я также попытался преобразовать RDD в виде массива двойников в Dataframe и получить плотный вектор ML следующим образом:
var parsedData = sc.textFile("/home/pililo/Documents/Mi_Memoria/Codigo/Datasets/Digits/digits480x.csv").map(s => Row(s.split(',').slice(0,64).map(_.toDouble)))
parsedData: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row]
val schema2 = new StructType().add("features", ArrayType(DoubleType))
schema2: org.apache.spark.sql.types.StructType = StructType(StructField(features,ArrayType(DoubleType,true),true))
val df = spark.createDataFrame(parsedData, schema2)
df: org.apache.spark.sql.DataFrame = [features: array<double>]
val df2 = df.map{ case Row(features: Array[Double]) => Row(org.apache.spark.ml.linalg.Vectors.dense(features)) }
Что вызывает следующую ошибку, хотя spark.implicits._
импортируется:
error: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.
Любая помощь приветствуется, спасибо!