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?