0

Я новичок в искры и искры ML. Я генерирую некоторые данные с помощью функции KMeansDataGenerator.generateKMeansRDD, но я не могу форматировать их, чтобы затем их можно было использовать алгоритмом ML (здесь это kmeans).Форматирование данных для искры ML

Ошибка

Исключение в потоке "основного" java.lang.IllegalArgumentException: Тип данных ArrayType (DoubleType, ложь) не поддерживается.

Это происходит при использовании VectorAssembler.

val generatedData = KMeansDataGenerator.generateKMeansRDD(sc, numPoints = 1000, k = 5, d = 3, 
     r = 5, numPartitions = 1) 

val df = generatedData.toDF() 

import org.apache.spark.ml.feature.VectorAssembler 

val assembler = new VectorAssembler() 
    .setInputCols(Array("value")) 
    .setOutputCol("features") 
val df_final = assembler.transform(df).select("features") 
df_final.show() 

val nbClusters = 5 
val nbIterations = 200 
val kmeans = new KMeans().setK(nbClusters).setSeed(1L).setMaxIter(nbIterations) 
val model = kmeans.fit(df) 

ответ

1

VectorAssembler принимает только три типа колонн:

  • DoubleType - двойной скаляр, необязательно с метаданными столбца.
  • NumericType - произвольный цифровой номер.
  • VectorUDT - vector column.

Вы пытаетесь пройти ArrayType(DoubleType), который не поддерживается. Вы должны преобразовать ваши данные в поддерживаемый тип (o.a.s.ml.linalg.DenseVector/VectorUDT кажется разумным выбором). Например:

import org.apache.spark.ml.linalg.Vectors 
import org.apache.spark.sql.functions.{col, udf} 

// Spark 2.0. For 1.x use mllib 
// https://spark.apache.org/docs/latest/sql-programming-guide.html#data-types 
val seqAsVector = udf((xs: Seq[Double]) => Vectors.dense(xs.toArray)) 

val df_final = df.withColumn("features", seqAsVector(col("value")))