1

Wie konvertiert man von org.apache.spark.mllib.linalg.SparseVector zu org.apache.spark.ml.linalg.SparseVector?Wie konvertiert man aus org.apache.spark.mllib.linalg.SparseVector in org.apache.spark.ml.linalg.SparseVector?

Ich konvertiere den Code von mllib in die API.

import org.apache.spark.mllib.linalg.{DenseVector, Vector} 
import org.apache.spark.ml.linalg.{DenseVector => NewDenseVector, Vector => NewVector} 
import org.apache.spark.mllib.regression.LabeledPoint 
import org.apache.spark.ml.feature.{LabeledPoint => NewLabeledPoint} 

val labelPointData = limitedTable.rdd.map { row => 
    new NewLabeledPoint(convertToDouble(row.head), row(1).asInstanceOf[org.apache.spark.ml.linalg.SparseVector]) 
} 

Anweisung row(1).asInstanceOf[org.apache.spark.ml.linalg.SparseVector] wird aufgrund der folgenden Ausnahme nicht funktioniert:

org.apache.spark.mllib.linalg.SparseVector cannot be cast to org.apache.spark.ml.linalg.SparseVector

Wie das überwinden?

Ich habe Code-Konvertierung von mllib zu gefunden, aber nicht umgekehrt.

Antwort

3

Es ist möglich, in beide Richtungen zu konvertieren. Zunächst lassen Sie schaffen die ein mllib SparseVector:

import org.apache.spark.mllib.linalg.Vectors 
val mllibVec: org.apache.spark.mllib.linalg.Vector = Vectors.sparse(3, Array(1,2,3), Array(1,2,3)) 

zu ML SparseVector konvertieren, verwenden Sie einfach asML:

val mlVec: org.apache.spark.ml.linalg.Vector = mllibVec.asML 

es zu konvertieren wieder zurück, ist der einfachste Weg Vectors.fromML() zu verwenden:

val mllibVec2: org.apache.spark.mllib.linalg.Vector = Vectors.fromML(mlVec) 

Darüber hinaus in Ihrer co de, anstatt row(1).asInstanceOf[SparseVector] könnten Sie versuchen row.getAs[SparseVector](1). Versuchen Sie, den Vektor als mllib Vektor liest, dann wandeln sie mit asML und gelangen in den ML-basierte LabeledPoint, d.h .:

val labelPointData = limitedTable.rdd.map { row => 
    NewLabeledPoint(convertToDouble(row.head), row.getAs[org.apache.spark.mllb.linalg.SparseVector](1).asML) 
} 
Verwandte Themen