如何对镶木地板文件应用主成分分析?
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)
部分。
我有一个包含 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)
部分。