2016-04-15 98 views
4

我试图序列化一个PySpark Pipeline对象,以便以后可以保存和检索它。尝试使用Python pickle库以及PySpark的PickleSerializerdumps()调用本身失败。如何序列化一个pyspark管道对象?

在使用本机pickle库时提供代码段。

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) 

提示以下错误:运行时:

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) 

是否可以序列化PySpark Pipeline对象?

回答

2

从技术上讲,你可以很容易地泡菜Pipeline对象:

from pyspark.ml.pipeline import Pipeline 
import pickle 

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

你不能泡菜是什么星火TransformersEstimators其中只有大约JVM对象的瘦包装。如果你真的需要这个你可以在一个函数把这个包,例如:

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

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

,但因为它仅仅是一段代码,不存储任何持久数据它看起来并不特别有用。

+0

这适用于我尝试使用空管道对象 - pickle.dumps(Pipeline(stages = [])),但是当我尝试用阶段腌制Pipeline对象时,它仍然失败。尝试了你提出的方法格式,但是如果我尝试pickle.dumps(make_pipeline()),它仍然会失败并出现相同的错误。 –

+0

我会:)再看看我的代码'pickle.dumps(make_pipeline)'和你的'pickle.dumps(make_pipeline)'。我只腌一个可用于生成管道的对象,而不是管道本身。 – zero323