格式化Spark ML的数据

时间:2016-12-11 18:41:05

标签: apache-spark apache-spark-sql rdd apache-spark-mllib apache-spark-ml

我是Spark和Spark ML的新手。 我使用函数KMeansDataGenerator.generateKMeansRDD生成了一些数据,但是在格式化时我失败了,以便ML算法可以使用它(这里是K-Means)。

错误是

  

线程“main”中的异常java.lang.IllegalArgumentException:不支持数据类型ArrayType(DoubleType,false)。

使用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 个答案:

答案 0 :(得分: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")))