2017-04-05 5 views
1

Ich stehe vor einem Problem, wenn ich versuche, einen Vektor aus einem Datenrahmen (Einige Spalten enthalten null Werte) in scala. Leider vectorAssembler kann nicht null Werte verarbeiten.Funken Datenrahmen zu spärlichen Vektor mit null

Was kann ich tun, ist zu ersetzen oder Datenrahmen des null Wert zu füllen und dann einen dense Vektor erstellen, aber das ist nicht das, was ich will.

Also dachte ich über die Konvertierung meiner Datenzeilen in einen Vektor sparse. Aber wie kann ich das erreichen? Ich habe keine Option für die vectorAssembler gefunden, um einen spärlichen Vektor zu machen.

EDIT: Eigentlich brauche ich nicht null in den spärlichen Vektor, aber es sollte kein Wert wie 0 oder andere sein, wie es für einen dichten Vektor der Fall wäre.

Haben Sie Vorschläge?

Antwort

1

Man könnte es so manuell tun:

import org.apache.spark.SparkException 
import org.apache.spark.ml.linalg.{Vector, Vectors} 
import org.apache.spark.sql.SparkSession 
import scala.collection.mutable.ArrayBuilder 

case class Row(a: Double, b: Option[Double], c: Double, d: Vector, e: Double) 

val dataset = spark.createDataFrame(
    Seq(new Row(0, None, 3.0, Vectors.dense(4.0, 5.0, 0.5), 7.0), 
    new Row(1, Some(2.0), 3.0, Vectors.dense(4.0, 5.0, 0.5), 7.0)) 
).toDF("id", "hour", "mobile", "userFeatures", "clicked") 

val sparseVectorRDD = dataset.rdd.map { row => 
    val indices = ArrayBuilder.make[Int] 
    val values = ArrayBuilder.make[Double] 
    var cur = 0 
    row.toSeq.foreach { 
    case v: Double => 
     indices += cur 
     values += v 
     cur += 1 
    case vec: Vector => 
     vec.foreachActive { case (i, v) => 
     indices += cur + i 
     values += v 
     } 
     cur += vec.size 
    case null => 
     cur += 1 
    case o => 
     throw new SparkException(s"$o of type ${o.getClass.getName} is not supported.") 
    } 
    Vectors.sparse(cur, indices.result(), values.result()) 
} 

Und es dann zu einem Datenrahmen konvertieren zurück, wenn nötig. Da Zeilenobjekte nicht typisiert sind, müssen Sie sie manuell behandeln und bei Bedarf in den entsprechenden Typ umwandeln.

+0

Klingt fair! Danke vielmals!!!! –

Verwandte Themen