2017-07-24 5 views
0

Ich möchte die Ausgabeklasse eines Spark dataframe mithilfe eines Naive-Klassifikatormodells vorhersagen, ich benutze die strukturierte Streaming-Funktionalität von Spark 2.1.0. Wenn ich versuche, das zu tun:Konvertieren eines Spark-Datenrahmens in Vector

tokenizer = Tokenizer(inputCol="message",outputCol="logTokenize") 
tokenizeData = tokenizer.transform(stream_df) 

hashingTF = HashingTF(inputCol="logTokenize", outputCol="rawFeatures", numFeatures = 1000) 
featurizedData = hashingTF.transform(tokenizeData) 
stream_df = featurizedData.select("rawFeatures") 

path = "/tmp/NaiveClassifier" 
naive_classifier_model = NaiveBayesModel.load(spark.sparkContext,path) 

predictions = naive_classifier_model.predict(stream_df) 

ich die folgende Fehlermeldung bekam:

TypeError: Cannot convert type <class 'pyspark.sql.dataframe.DataFrame'> into Vector 

stream_df ist ein Spark-Datenrahmen und ich möchte einen Datenrahmen mit rawFeatures und den vorhergesagten Klassen Spalten erhalten.

Antwort

0

Verwenden pyspark.ml.feature.VectorAssembler zu Vektor zu transformieren,

from pyspark.ml.feature import VectorAssembler 
vecAssembler = VectorAssembler(inputCols=['rawFeatures'], outputCol="features") 
stream_df = vecAssembler.transform(featurizedData) 

Auch Sie verwenden Tokenzier, Häsing TF Transformatoren als auch. Also, ich glaube, Sie können die ML-Pipeline verwenden, um alle Transformer zusammen zu passen. Nur ein Vorschlag, schau mal rein.

+0

versuchte ich, dass vor, das Problem, das ich denke, ist das Naive Klassifikator Objekt, wenn ich versuche, die 'naive_classifier_model.fit (stream_df) zu nennen' ich einen Fehler, und ich denke, Ich kann die "Predicate" -Funktion nicht mit der Ausgabe des 'VectorAssembler' aufrufen. Ja, es ist besser, eine Pipeline zu verwenden, aber derzeit mache ich das zum Debuggen –

+0

Sie haben den gleichen Fehler, während mit Vectoresembler versucht? – Suresh

0

Versuchen Sie es mit float:

path = "/tmp/NaiveClassifier" 
naive_classifier_model = NaiveBayesModel.load(spark.sparkContext,path) 

prediction= stream_df.rdd.map(lambda p:(float(naive_classifier_model.predict(p.rawFeatures)))) 
+0

Ich habe die folgende Fehlermeldung erhalten, wenn ich das versuche: ''DataFrame' Objekt hat kein Attribut 'map', benutze das strukturierte Streaming. Im Programmierleitfaden ist angegeben, dass wir die Funktion 'map' des Datenrahmens anwenden können. –

+0

Was ist die Spark-Version, die Sie verwenden? probiere das- 'prodiction = stream_df.rdd.map (Lambda p: (float (naive_classifier_model.predict (p.rawFeatures))))' Spark 2 hat die direkte Karte vom Datenrahmen entfernt –