如何在 spark scala 中保存 PCA 对象?

How to save PCA object in spark scala?

我正在对我的数据进行主成分分析,我阅读了以下指南:https://spark.apache.org/docs/latest/mllib-dimensionality-reduction

相关代码如下:

import org.apache.spark.mllib.feature.PCA
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD

val data: RDD[LabeledPoint] = sc.parallelize(Seq(
  new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 1)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 1, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0)),
  new LabeledPoint(0, Vectors.dense(1, 0, 0, 0, 0)),
  new LabeledPoint(1, Vectors.dense(1, 1, 0, 0, 0))))

// Compute the top 5 principal components.
val pca = new PCA(5).fit(data.map(_.features))

// Project vectors to the linear space spanned by the top 5 principal
// components, keeping the label
val projected = data.map(p => p.copy(features = pca.transform(p.features)))

此代码对数据执行 PCA。但是,我找不到示例代码或文档来解释如何保存和加载适合的 PCA 对象以供将来使用。有人可以根据上面的代码给我一个例子吗?

PCA mlib 版本似乎不支持将模型保存到磁盘。您可以保存生成的 PCAModel 的 pc 矩阵。但是,使用晶石MLversion。它 returns 一个可以序列化并包含在 Spark ML 管道中的 Spark Estimator。

基于@EmiCareOfCell44 答案的示例代码,使用 PCAPCAModel 来自 org.apache.spark.ml.feature:

import org.apache.spark.ml.feature.{PCA, PCAModel}
import org.apache.spark.ml.linalg.Vectors

val data = Array(
  Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),
  Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
  Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)
)
val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")

val pca = new PCA()
  .setInputCol("features")
  .setOutputCol("pcaFeatures")
  .setK(3)
  .fit(df)

val result = pca.transform(df).select("pcaFeatures")
result.show(false)

// save the model
val savePath = "xxxx"
pca.save(savePath)

// load the save model
val pca_loaded = PCAModel.load(savePath)