2015-10-09 22 views
6

Tôi tương đối mới với Spark và Scala.Chuyển đổi RDD [org.apache.spark.sql.Row] thành RDD [org.apache.spark.mllib.linalg.Vector]

Tôi bắt đầu với dataframe sau (cột đơn được làm từ một Vector dày đặc của đôi):

scala> val scaledDataOnly_pruned = scaledDataOnly.select("features") 
scaledDataOnly_pruned: org.apache.spark.sql.DataFrame = [features: vector] 

scala> scaledDataOnly_pruned.show(5) 
+--------------------+ 
|   features| 
+--------------------+ 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
|[-0.0948337274182...| 
+--------------------+ 

Chuyển đổi thẳng đến RDD mang lại một thể hiện của org.apache.spark.rdd.RDD [ org.apache.spark.sql.Row]:

scala> val scaledDataOnly_rdd = scaledDataOnly_pruned.rdd 
scaledDataOnly_rdd: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[32] at rdd at <console>:66 

có ai biết làm thế nào để chuyển đổi DF này để một thể hiện của org.apache.spark.rdd.RDD [org.apache.spark.mllib.linalg. Vector] thay vào đó? Nỗ lực khác nhau của tôi đã không thành công cho đến nay.

Cảm ơn bạn trước cho bất kỳ con trỏ nào!

Trả lời

6

Chỉ cần phát hiện ra:

val scaledDataOnly_rdd = scaledDataOnly_pruned.map{x:Row => x.getAs[Vector](0)} 
5

EDIT: sử dụng cách tinh vi hơn để giải thích trường trong Row.

này được làm việc cho tôi

val featureVectors = features.map(row => { 
    Vectors.dense(row.toSeq.toArray.map({ 
    case s: String => s.toDouble 
    case l: Long => l.toDouble 
    case _ => 0.0 
    })) 
}) 

tính năng là một DataFrame của spark SQL.

0
import org.apache.spark.mllib.linalg.Vectors 

scaledDataOnly 
    .rdd 
    .map{ 
     row => Vectors.dense(row.getAs[Seq[Double]]("features").toArray) 
    } 
Các vấn đề liên quan