2015-03-25 105 views
11

\負荷模型我使用PySpark和MLlib星火1.3.0工作的正確方法,我需要保存和載入我的模型。我用這樣的代碼(來自官方documentation拍攝)什麼是保存在星火 PySpark

from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating 

data = sc.textFile("data/mllib/als/test.data") 
ratings = data.map(lambda l: l.split(',')).map(lambda l: Rating(int(l[0]), int(l[1]), float(l[2]))) 
rank = 10 
numIterations = 20 
model = ALS.train(ratings, rank, numIterations) 
testdata = ratings.map(lambda p: (p[0], p[1])) 
predictions = model.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2])) 
predictions.collect() # shows me some predictions 
model.save(sc, "model0") 

# Trying to load saved model and work with it 
model0 = MatrixFactorizationModel.load(sc, "model0") 
predictions0 = model0.predictAll(testdata).map(lambda r: ((r[0], r[1]), r[2])) 

後,我嘗試使用model0我得到一個長回溯,這隻能到此爲止:

Py4JError: An error occurred while calling o70.predict. Trace: 
py4j.Py4JException: Method predict([class org.apache.spark.api.java.JavaRDD]) does not exist 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:333) 
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:342) 
    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:207) 
    at java.lang.Thread.run(Thread.java:745) 

所以我的問題是 - 我是做錯了什麼?據我調試,我的模型存儲(本地和HDFS),他們包含許多文件與一些數據。我有一種感覺,模型保存正確,但可能他們沒有正確加載。我也搜索了一下,但沒有發現任何相關信息。

貌似這個保存\加載功能已被添加在最近因爲這個星火1.3.0,我有另外一個問題 - 什麼是推薦的方式發佈1.3.0之前保存\負荷模型?我還沒有找到任何好的方法來做到這一點,至少對於Python來說。我也試過味酸,但面臨着同樣的問題,這裏描述Save Apache Spark mllib model in python

回答

2

我碰到這也是 - 它看起來像一個bug。我已經報告給spark jira

+0

十分感謝!看起來像這是一個Python綁定只有bug .. – artemdevel 2015-03-30 08:53:31

5

由於this pull request於2015年3月28日合併(一天後,你的問題是最後編輯)這個問題已經得到解決。

您只需要從GitHub(git clone git://github.com/apache/spark.git -b branch-1.3)克隆/獲取最新版本,然後使用$ mvn -DskipTests clean package構建它(遵循spark/README.md中的說明)。

注:我遇到了麻煩建設星火因爲Maven的是被靠不住的。我通過使用$ update-alternatives --config mvn並選擇優先級爲150的'路徑'來解決該問題,無論這意味着什麼。 Explanation here。保存模型

+0

是的,我見過這個公關,謝謝!但我還沒有嘗試過自己構建Spark。另外感謝Maven提供的技巧:) – artemdevel 2015-03-31 20:13:07

6

的一種方式(Scala中,但可能是在Python類似):

// persist model to HDFS 
sc.parallelize(Seq(model), 1).saveAsObjectFile("linReg.model") 
然後

保存的模型可以加載爲:

val linRegModel = sc.objectFile[LinearRegressionModel]("linReg.model").first() 

也見相關question

欲瞭解更多詳情,請參閱(ref

0

使用pi在ML中使用Peline來訓練模型,然後使用MLWriter和MLReader保存模型並將其讀回。

from pyspark.ml import Pipeline 
from pyspark.ml import PipelineModel 

pipeTrain.write().overwrite().save(outpath) 
model_in = PipelineModel.load(outpath) 
+1

謝謝,但這個問題是非常古老的:)很多事情從它被問到的時候已經改變。 – artemdevel 2017-10-13 17:39:01