我有一个包含id的aparquet文件,feature .id为int,feature为double。我想应用pca算法来减小尺寸。
val lData = sqlContext.read.parquet("/usr/local/spark/dataset/model/data/user")
val vecData = lData.rdd.map(s => Vectors.dense(s.getInt(0),s.getDouble(1))).cache()
val mat = new RowMatrix(vecData)
val pc = mat.computePrincipalComponents(5)
val projected = mat.multiply(pc)
val projectedRDD=projected.rows
projectedRDD.saveAsTextFile("file:///usr/local/spark/dataset/PCA")
但出现此错误
由于:java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofRef无法转换为java.lang.Double
如何解决?
Salma,
使用文件,我们可以看到要素是一个数组[Double]:
lData.printSchema
root
|-- id: integer (nullable = true)
|-- features: array (nullable = true)
| |-- element: double (containsNull = true)
为了使代码正常工作,您可以将第二行更改为:
val vecData = lData.rdd.map(s => Vectors.dense(s.getInt(0),s.getAs[Seq[Double]](1):_*)).cache()
注意:通常,我只使用Vector中的功能。取决于您的id
代表什么,也许您不需要s.getInt(0)
部分。