【问题标题】:How to convert org.apache.spark.rdd.RDD[Array[Double]] to Array[Double] which is required by Spark MLlib如何将 org.apache.spark.rdd.RDD[Array[Double]] 转换为 Spark MLlib 所需的 Array[Double]
【发布时间】:2015-03-06 05:14:39
【问题描述】:

我正在尝试实现KMeans using Apache Spark

val data = sc.textFile(irisDatasetString)
val parsedData = data.map(_.split(',').map(_.toDouble)).cache()

val clusters = KMeans.train(parsedData,3,numIterations = 20)

我收到以下错误:

error: overloaded method value train with alternatives:
  (data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector],k: Int,maxIterations: Int,runs: Int)org.apache.spark.mllib.clustering.KMeansModel <and>
  (data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector],k: Int,maxIterations: Int)org.apache.spark.mllib.clustering.KMeansModel <and>
  (data: org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector],k: Int,maxIterations: Int,runs: Int,initializationMode: String)org.apache.spark.mllib.clustering.KMeansModel
 cannot be applied to (org.apache.spark.rdd.RDD[Array[Double]], Int, numIterations: Int)
       val clusters = KMeans.train(parsedData,3,numIterations = 20)

所以我尝试将 Array[Double] 转换为 Vector,如图所示 here

scala> val vectorData: Vector = Vectors.dense(parsedData)

我收到以下错误:

error: type Vector takes type parameters
   val vectorData: Vector = Vectors.dense(parsedData)
                   ^
error: overloaded method value dense with alternatives:
  (values: Array[Double])org.apache.spark.mllib.linalg.Vector <and>
  (firstValue: Double,otherValues: Double*)org.apache.spark.mllib.linalg.Vector
 cannot be applied to (org.apache.spark.rdd.RDD[Array[Double]])
       val vectorData: Vector = Vectors.dense(parsedData)

所以我推断 org.apache.spark.rdd.RDD[Array[Double]] 和 Array[Double] 不一样

如何以 org.apache.spark.rdd.RDD[Array[Double]] 的身份处理我的数据?或者我该如何转换org.apache.spark.rdd.RDD[Array[Double]] to Array[Double]

【问题讨论】:

    标签: apache-spark apache-spark-mllib


    【解决方案1】:

    KMeans.train 期待 RDD[Vector] 而不是 RDD[Array[Double]]。在我看来,你需要做的就是改变

    val parsedData = data.map(_.split(',').map(_.toDouble)).cache()
    

    val parsedData = data.map(x => Vectors.dense(x.split(',').map(_.toDouble))).cache()
    

    【讨论】:

    • 不,这不起作用。我现在收到以下错误:错误:缺少扩展函数的参数类型 ((x$1) => x$1.split(',').map(((x$2) => x$2.toDouble))) val parsedData = data.map(Vectors.dense(.split(',').map(.toDouble))).cache()
    • 我也试过了。所以我得到了 parsedData 类型:org.apache.spark.rdd.RDD[org.apache.spark.mllib.linalg.Vector] ,然后我尝试使用:val dataArray = parsedData.collect val dataVector = Vectors.dense(dataArray) 转换为 Vector,这也不起作用,因为我的 dataArray 是 Array[org.apache.spark.mllib.linalg.Vector]Vector.dense 期望 Array[Double]
    • 您为什么希望RDD[Vector] 成为单个向量? KMeans.train 期待 RDD[Vector]
    • 你是对的 :) 出于某种原因,我认为我必须收集数据,然后将其传递给 k 手段。您的解决方案有效:) 谢谢。
    • 嘿 Climbage,你如何在 pyspark 中写同样的东西?我正在尝试获取 CSV 文件中存在的数据的多变量统计信息。该函数需要 RDD[Vectors]。我不知道如何获得它们
    猜你喜欢
    • 2015-01-09
    • 2015-02-04
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    相关资源
    最近更新 更多