0

我是新的火花和火花ML。 我使用函数KMeansDataGenerator.generateKMeansRDD生成了一些数据,但是我在格式化这些数据时失败,以至于可以使用ML算法(这里是kmeans)。格式化数据火花ML

该错误是

异常在线程 “主” java.lang.IllegalArgumentException异常:数据类型数组类型(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 - 矢量列。

您正在尝试通过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")))