Scala 如何将spark数据帧转换为RDD mllib标签点?
我尝试对我的数据应用PCA,然后对转换后的数据应用RandomForest。然而,PCA.transform(data)给了我一个数据帧,但我需要一个mllib标签点来填充我的随机森林。我该怎么做? 我的代码: 我尝试了以下两种可能的解决方案,但均无效:Scala 如何将spark数据帧转换为RDD mllib标签点?,scala,apache-spark,rdd,pca,apache-spark-mllib,Scala,Apache Spark,Rdd,Pca,Apache Spark Mllib,我尝试对我的数据应用PCA,然后对转换后的数据应用RandomForest。然而,PCA.transform(data)给了我一个数据帧,但我需要一个mllib标签点来填充我的随机森林。我该怎么做? 我的代码: 我尝试了以下两种可能的解决方案,但均无效: scala> val pcaTrainingData = trainingData.map(p => p.copy(features = pca.transform(p.features))) <console>:3
scala> val pcaTrainingData = trainingData.map(p => p.copy(features = pca.transform(p.features)))
<console>:39: error: overloaded method value transform with alternatives:
(dataset: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame <and>
(dataset: org.apache.spark.sql.DataFrame,paramMap: org.apache.spark.ml.param.ParamMap)org.apache.spark.sql.DataFrame <and>
(dataset: org.apache.spark.sql.DataFrame,firstParamPair: org.apache.spark.ml.param.ParamPair[_],otherParamPairs: org.apache.spark.ml.param.ParamPair[_]*)org.apache.spark.sql.DataFrame
cannot be applied to (org.apache.spark.mllib.linalg.Vector)
(在上述案例中,我已经导入了org.apache.spark.mllib.linalg.Vectors)
有什么帮助吗?这里的正确方法是您尝试的第二种方法-将每个
行
映射到标签点
以获得RDD[标签点]
。但是,它有两个错误:
Vector
类(org.apache.spark.mllib.linalg.Vector
)不带类型参数(例如Vector[Int]
)-因此,即使您有正确的导入,编译器仍然认为您的意思是scala.collection.immutable.Vector
,而实际上是这样PCA.fit()
返回的数据帧有3列,您试图提取第4列。例如,显示前4行:
+-----+--------------------+--------------------+
|label| features| pcaFeatures|
+-----+--------------------+--------------------+
| 5.0|(780,[152,153,154...|[880.071111851977...|
| 1.0|(780,[158,159,160...|[-41.473039034112...|
| 2.0|(780,[155,156,157...|[931.444898405036...|
| 1.0|(780,[124,125,126...|[25.5114585648411...|
+-----+--------------------+--------------------+
为了简化这个过程,我更喜欢使用列名而不是它们的索引val labeled = pca.transform(trainingDf).rdd.map(row => LabeledPoint(
row.getAs[Double]("label"),
row.getAs[org.apache.spark.mllib.linalg.Vector]("pcaFeatures")
))
您的代码对我来说很好(没有两次解决方案尝试)。我猜也许你有一个进口错了?我正在使用导入org.apache.spark.ml.feature.PCA,
导入org.apache.spark.mllib.util.MLUtils
。我用这个文件运行它:@TzachZohar哦,我有和你一样的导入,我通过添加它们编辑了我的问题。我还使用了相同的数据文件。是因为我是在壳牌公司而不是spark submit公司运行,所以它不起作用吗?为什么所有人都投了反对票?这似乎是个合理的问题。
+-----+--------------------+--------------------+
|label| features| pcaFeatures|
+-----+--------------------+--------------------+
| 5.0|(780,[152,153,154...|[880.071111851977...|
| 1.0|(780,[158,159,160...|[-41.473039034112...|
| 2.0|(780,[155,156,157...|[931.444898405036...|
| 1.0|(780,[124,125,126...|[25.5114585648411...|
+-----+--------------------+--------------------+
val labeled = pca.transform(trainingDf).rdd.map(row => LabeledPoint(
row.getAs[Double]("label"),
row.getAs[org.apache.spark.mllib.linalg.Vector]("pcaFeatures")
))