2016-04-15 13 views
4

Ich versuche ein PySpark Pipeline Objekt zu serialisieren, so dass es später gespeichert und abgerufen werden kann. Versucht, die Python-Beiz-Bibliothek sowie die PickleSerializer von PySpark zu verwenden, schlägt der dumps() Aufruf selbst fehl.Wie wird ein pyspark-Pipeline-Objekt serialisiert?

Bereitstellung des Code-Snippets bei Verwendung der nativen pickle-Bibliothek.

pipeline = Pipeline(stages=[tokenizer, hashingTF, lr]) 
with open ('myfile', 'wb') as f: 
    pickle.dump(pipeline,f,2) 
with open ('myfile', 'rb') as f: 
    pipeline1 = pickle.load(f) 

gibt es die folgenden Fehler beim Laufen:

py4j.protocol.Py4JError: An error occurred while calling o32.__getnewargs__. Trace: 
py4j.Py4JException: Method __getnewargs__([]) does not exist 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:335) 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:344) 
    at py4j.Gateway.invoke(Gateway.java:252) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:209) 
    at java.lang.Thread.run(Thread.java:785) 

Ist es möglich, PySpark Pipeline Objekte zu serialisieren?

Antwort

2

Technisch gesehen Sie leicht Pipeline Objekt Beize kann:

from pyspark.ml.pipeline import Pipeline 
import pickle 

pickle.dumps(Pipeline(stages=[])) 
## b'\x80\x03cpyspark.ml.pipeline\nPipeline\nq ... 

Was Sie nicht Beize Transformers und Estimators ist Funke, um JVM Objekte nur dünne Wrapper sind. Wenn Sie wirklich diese benötigen, können Sie diese in einer Funktion zum Beispiel wickeln:

def make_pipeline(): 
    return Pipeline(stages=[Tokenizer(inputCol="text", outputCol="words")]) 

pickle.dumps(make_pipeline) 
## b'\x80\x03c__ ... 

aber da es nur ein Stück Code und speichert keine persistenten Daten sieht es nicht besonders nützlich.

+0

Das funktioniert, wenn ich versuche, mit einem leeren Pipeline-Objekt zu arbeiten - pickle.dumps (Pipeline (stages = [])), aber wenn ich versuche, ein Pipeline-Objekt mit Stufen zu beizen, schlägt es noch fehl. Ich habe das von Ihnen vorgeschlagene Methodenformat versucht, aber wenn ich pickle.dumps (make_pipeline()) versuche, schlägt es immer noch mit dem gleichen Fehler fehl. –

+0

Und ich werde :) Werfen Sie einen Blick auf meinen Code 'pickle.dumps (make_pipeline)' und Ihre 'pickle.dumps (make_pipeline)'. Ich beize nur ein Objekt, das verwendet werden kann, um Pipeline, keine Pipeline selbst zu erzeugen. – zero323

Verwandte Themen