2015-10-24 20 views
6

Ich steige in Funke bin und ich habe Probleme mit Vektoren Import org.apache.spark.mllib.linalg {Vektoren, Vektor}Funken: Geben Sie einen Vektor

Der Eingang meines Programms ist eine Textdatei. mit der Ausgabe eines RDD (Vector) enthält: dataset.txt:

[-0.5069793074881704,-2.368342680619545,-3.401324690974588] 
[-0.7346396928543871,-2.3407983487917448,-2.793949129209909] 
[-0.9174226561793709,-0.8027635530022152,-1.701699021443242] 
[0.510736518683609,-2.7304268743276174,-2.418865539558031] 

Also, was einen Versuch zu tun:

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map(s => Vectors.dense(s.split(',').map(_.toDouble))) 

habe ich den Fehler, da es lesen [0,510736 518683609 als eine Nummer. Gibt es ein Formular, um den in der Textdatei gespeicherten Vektor ohne die zweite Zeile direkt zu laden? Wie kann ich "[" im Kartenstadium löschen? Ich bin wirklich neu in Funken, tut mir leid, wenn es eine sehr offensichtliche Frage ist.

Antwort

1

Hier ist eine Möglichkeit, es zu tun:

val rdd = sc.textFile("/workingdirectory/dataset") 
val data = rdd.map { 
    s => 
    val vect = s.replaceAll("\\[", "").replaceAll("\\]","").split(',').map(_.toDouble) 
    Vectors.dense(vect) 
} 

Ich habe nur brach die Karte in Zeile zur besseren Lesbarkeit Zweck.

Hinweis: Denken Sie daran, es ist einfach eine Zeichenfolge Verarbeitung auf jeder Zeile.

+0

Wie wäre es 'Tropfen (1) .dropRight (1) .split ("") Karte (. _ ToDouble)' oder 'val p =„- [0-9] + (?: \\. [0-9] +)? ". p.findAllIn (s) .map (_. toDouble) '? – zero323

+0

Deshalb habe ich eine Richtung gesagt! :) – eliasah

4

Da der Eingang das einfachste, was man tun kann Vectors.parse verwenden:

scala> import org.apache.spark.mllib.linalg.Vectors 
import org.apache.spark.mllib.linalg.Vectors 

scala> Vectors.parse("[-0.50,-2.36,-3.40]") 
res14: org.apache.spark.mllib.linalg.Vector = [-0.5,-2.36,-3.4] 

Es funktioniert auch mit spärlicher Darstellung:

scala> Vectors.parse("(10,[1,5],[0.5,-1.0])") 
res15: org.apache.spark.mllib.linalg.Vector = (10,[1,5],[0.5,-1.0]) 

Kombinieren Sie es mit Ihren Daten alles, was Sie brauchen:

rdd.map(Vectors.parse) 

Wenn Sie fehlerhafte/leere Zeilen erwarten, können Sie uns einpacken ing Try.?

import scala.util.Try 

rdd.map(line => Try(Vectors.parse(line))).filter(_.isSuccess).map(_.get) 
+1

Ich wusste nicht einmal, dass diese Methode existiert! Vielen Dank – eliasah

Verwandte Themen