2016-05-10 14 views
1

ich einen Funken Datenrahmen haben, die einen Vektor in sich hat:Funken Scala: Vektordatenrahmen zu RDD von Werten

org.apache.spark.sql.DataFrame = [sF: vector] 

und ich versuche, es zu einer RDD von Werten zu konvertieren:

org.apache.spark.rdd.RDD[(Double, Double)] 

Allerdings konnte ich es nicht richtig konvertieren. Ich habe versucht:

val m2 = m1.select($"sF").rdd.map{case Row(v1, v2) => (v1.toString.toDouble, v2.toString.toDouble)} 

und es kompiliert, aber ich erhalte einen Laufzeitfehler:

scala.MatchError: [[-0.1111111111111111,-0.2222222222222222]] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema) 

, wenn ich tun:

m2.take(10).foreach(println). 

Gibt es etwas, was ich falsch mache?

Antwort

3

Vorausgesetzt, dass Sie die ersten beiden Werte der Vektoren in den sF Spalt wollen, vielleicht wird diese Arbeit:

import org.apache.spark.mllib.linalg.Vector 
val m2 = m1 
    .select($"sF") 
    .map { case Row(v: Vector) => (v(0), v(1)) } 

Du einen Fehler bekommen, denn wenn man case Row(v1, v2) tun, wird es nicht um den Inhalt anzeigen lassen von die Zeilen in Ihrem Datenrahmen, da Sie in jeder Zeile zwei Werte erwarten (v1 und v2), aber es gibt nur einen: einen Vektor.

Hinweis: Sie müssen .rdd nicht aufrufen, wenn Sie einen .map-Vorgang ausführen möchten.

+0

Danke für die Hilfe. Ich erhalte einen Fehler: Any nimmt beim Aufruf von v (2) keine Parameter entgegen. Irgendwelche Ideen warum? – mt88

+0

Ist Ihr Code genau meiner? Oder Sie verzichten auf den 'v: Vector'? Der explizite 'Vector' Typ muss da sein. Vergessen Sie auch nicht den Import. –

+0

Nein, ich schließe die v: Vector Teil – mt88

Verwandte Themen