如何对镶木地板文件应用主成分分析?

How to apply Principal Component Analysis for parquet file?

我有一个包含 id、特征的 parquet 文件。id 是 int,特征是 double.I 想应用 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")

但是出现这个错误

Caused by: java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to java.lang.Double

如何解决?

萨尔玛,

使用你的文件我们可以看到 features 是一个 Array[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()

注意:通常我只使用 Vectors 中的特征。根据您的 id 代表什么,也许您不需要 s.getInt(0) 部分。