2016-03-22 16 views
0

Ich weiß, dass einige Fragen zu ähnlichen Themen gestellt wurden, aber ich konnte keine der Antworten auf mein Problem anwenden, auch ich frage mich über Best Practices.Umwandlung eines Datasets von SQL zu RDD [Vektor]

Ich habe ein Dateset für ML in eine SQL-Datenbank geladen. Ich möchte mllibs Clustering-Funktion entsprechend anwenden. Ich habe die SQL-Datenbank auf DataFrame mit sqlContext geladen, ließ die irrelevanten Spalten fallen. dann passierte der problematische Teil, ich erstelle einen Vektor, indem ich jede Zeile des DataFrames analysiere. Der Vektor wird dann unter Verwendung der toJavaRDD-Funktion in RDD umgewandelt. Hier

ist der Code (Werke):

val usersDF = sqlContext.read.format("jdbc").option("url","jdbc:mysql://localhost/database"). 
    option("driver","com.mysql.jdbc.Driver").option("dbtable","table"). 
    option("user","woot").option("password","woot-password").load() 

val cleanDF = usersDF.drop("id").drop("username") 
cleanDF.show() 

val parsedData = cleanDF.map(s => Vectors.dense(s.toString().replaceAll("[\\[\\]]", "").trim.split(',').map(_.toDouble))).cache() 

val splits = parsedData.randomSplit(Array(0.6,0.4), seed = 11L) 
val train_set = splits(0).cache() 

val gmm = new GaussianMixture().setK(2).run(train_set) 

Meine Hauptfrage in Bezug auf das, was ich lese auf Funken Dokumentation über: Local vector, in meinem Verständnis wird die Datenrahmen-Mapping auf die Arbeiter und später durchgeführt werden, wird Wird beim Erstellen des Vektors an den Treiber gesendet (ist das die Bedeutung des lokalen Vektors), um später wieder an die Arbeiter gesendet zu werden? Gibt es dafür keinen besseren Weg?

Eine andere Sache ist, dass es ein wenig seltsam scheint, SQL nur in DataFrame zu laden, um es in einen String umzuwandeln und es erneut zu parsen. Gibt es noch weitere Best Practice-Vorschläge?

Antwort

0

Vom link vorgeschlagen, dass Sie

Ein lokaler Vektor hat integer typisierte und 0-basierte Indizes und doppelt getippt Werte, auf einer einzigen Maschine gespeichert. MLlib unterstützt zwei Arten von lokalen Vektoren: dicht und spärlich.

Eine verteilte Matrix hat lange typisierte Zeilen- und Spaltenindizes und doppelt typisierte Werte, die verteilend in einer oder mehreren RDDs gespeichert sind.

Die lokale Vektor sind wie jedes Objekt verhalten Sie für Ihre RDD (String, Integer, Array), werden sie erstellt und gespeichert , dem Arbeiter-Knoten, und nur, wenn Sie sammeln sie auf einer einzigen Maschine verwenden würde Sie werden an den Treiberknoten gesendet.

Wenn Sie einen Vektor x der Größe betrachten 2n es verteilend speichern Sie es in zwei Hälften der Länge trennen würde n, x1 und x2, (x = x1::x2). Um das Skalarprodukt mit einem anderen Vektor y auszuführen, führen die Arbeiter r1=x1*y1 (auf Maschine 1) und r2=x2*y2 (auf Maschine 2) aus, und dann müssen Sie die Teilergebnisse gruppieren, die r=r1+r2 geben. Ihr Vektor x ist verteilt, die Vektoren x1 und x2 sind wiederum lokale Vektoren. Wenn Sie x als lokalen Vektor haben, können Sie in einem einzigen Schritt auf einem Worker-Knoten r=x*y ausführen.

Für Ihre zweite Frage, sehe ich nicht, warum Sie die Vektoren im SQL-Format speichern würden. Eine solche CSV-Datei wäre ausreichend:

label feature1 feature2 ... 
1, 0.5,  1.2  ... 
0, 0.2,  0.5  ... 
Verwandte Themen