web-dev-qa-db-ja.com

RDD [org.Apache.spark.sql.Row]をRDD [org.Apache.spark.mllib.linalg.Vector]に変換しています

私はSparkとScalaに比較的慣れていません。

私は次のデータフレームから始めています(二重の密なベクトルから作られた単一の列):

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...|
+--------------------+

RDDに直接変換すると、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

代わりに、このDFをorg.Apache.spark.rdd.RDD [org.Apache.spark.mllib.linalg.Vector]のインスタンスに変換する方法を知っている人はいますか?これまでのところ失敗しています。

よろしくお願いします!

10
Yeye

ちょうど見つけた:

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

編集:行のフィールドを解釈するために、より洗練された方法を使用します。

これは私のために働いています

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

機能はspark SQLのDataFrameです。

5
andrew
import org.Apache.spark.mllib.linalg.Vectors

scaledDataOnly
   .rdd
   .map{
      row => Vectors.dense(row.getAs[Seq[Double]]("features").toArray)
     }
1
Santoshi M