为 Spark ML 格式化数据
Formatting data for Spark ML
我是 spark 和 Spark ML 的新手。
我使用函数 KMeansDataGenerator.generateKMeansRDD 生成了一些数据,但是在格式化这些数据时我失败了,以便它可以被 ML 算法使用(这里是 K-Means)。
错误是
Exception in thread "main" java.lang.IllegalArgumentException: Data type ArrayType(DoubleType,false) is not supported.
在使用 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)
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")))
我是 spark 和 Spark ML 的新手。 我使用函数 KMeansDataGenerator.generateKMeansRDD 生成了一些数据,但是在格式化这些数据时我失败了,以便它可以被 ML 算法使用(这里是 K-Means)。
错误是
Exception in thread "main" java.lang.IllegalArgumentException: Data type ArrayType(DoubleType,false) is not supported.
在使用 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)
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")))