Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将spark数据帧转换为RDD mllib标签点?_Scala_Apache Spark_Rdd_Pca_Apache Spark Mllib - Fatal编程技术网

Scala 如何将spark数据帧转换为RDD 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

我尝试对我的数据应用PCA,然后对转换后的数据应用RandomForest。然而,PCA.transform(data)给了我一个数据帧,但我需要一个mllib标签点来填充我的随机森林。我该怎么做? 我的代码:

我尝试了以下两种可能的解决方案,但均无效:

 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")
    ))