2015-01-08 21 views
10

Tôi đang cố triển khai KMeans using Apache Spark.Cách chuyển đổi org.apache.spark.rdd.RDD [Array [Double]] thành Array [Double] được yêu cầu bởi Spark MLlib

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

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

mà tôi nhận được lỗi sau:

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) 

vì vậy tôi cố gắng chuyển đổi Array [đúp] để vector như here

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

trên mà tôi nhận được lỗi sau:

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) 

Vì vậy, tôi suy luận rằng org.apache.spark.rdd.RDD[Array[Double]] là không giống như Array [đúp]

Làm thế nào tôi có thể tiến hành với dữ liệu của tôi như org.apache.spark.rdd.RDD[Array[Double]]? hoặc làm cách nào để tôi có thể chuyển đổi org.apache.spark.rdd.RDD[Array[Double]] to Array[Double]?

Trả lời

6

KMeans.train đang mong đợi RDD[Vector] thay vì RDD[Array[Double]]. Dường như với tôi rằng tất cả các bạn cần làm là thay đổi

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

để

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

Không, đó không hoạt động. Tôi nhận được lỗi sau: lỗi: thiếu kiểu tham số cho hàm mở rộng ((x $ 1) => x $ 1.split (','). Map (((x $ 2) => x $ 2.toDouble))) val parsedData = data.map (Vectors.dense (_. split (','). map (_. toDouble))). cache() – sand

+0

@sand Xem phần chỉnh sửa của tôi. Tôi đã sai cú pháp Scala. – climbage

+0

Tôi cũng đã thử điều đó. Vì vậy, tôi nhận được phân tích cú phápData loại: 'org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg.Vector]' mà sau đó tôi cố gắng chuyển đổi sang một Vector bằng cách sử dụng: 'val dataArray = parsedData.collect val dataVector = Vectors.dense (dataArray) 'không hoạt động vì dataArray của tôi là' Array [org.apache.spark.mllib.linalg.Vector] 'và' Vector.dense' mong đợi một 'Array [Double]' – sand

Các vấn đề liên quan