2015-03-25 11 views
11

yılında \ yük modellerini kaydetmek için sağ yolu nedir ve ben kaydetmek ve benim modellerini yüklemeniz gerekir. Ben model0 kullanmayı deneyin sonra ben bu ile biten bir uzun Traceback olsun (resmi documentation alınan) böyle bir kodBen PySpark ve MLlib kullanarak Spark 1.3.0 ile çalışıyorum Kıvılcım 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])) 

kullanın:

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) 

Yani benim sorudur - Neredeyim yanlış bir şey mi yapıyorsun? Hata ayıkladığımda modellerim (yerel olarak ve HDFS'de) saklanır ve bazı verilerde çok sayıda dosya içerir. Modellerin doğru bir şekilde kaydedildiğini hissediyorum, ancak muhtemelen doğru yüklenmemiş. Ayrıca etrafta dolaştım ama hiçbir şey bulamadım.

Bu kaydetme \ yük özelliği yakın zamanda Spark 1.3.0'da eklenmiş gibi görünüyor ve bunun için başka bir sorum var - 1.3.0 sürümünden önce modelleri yüklemek için önerilen yol neydi? En azından Python için bunu yapmanın hiçbir yolunu bulamadım. Ayrıca Pickle'ı denedim ama burada açıklandığı gibi aynı sorunlarla karşılaştım. Save Apache Spark mllib model in python

cevap

2

Buna da rastlıyorum - bir hataya benziyor. spark jira bildirdim.

+0

Harika teşekkürler! Bu bir Python bağlamaları sadece hata olduğunu görünüyor .. – artemdevel

5

28 Mart 2015'te (sorunuzun en son düzenlendikten bir gün sonra) birleştirildiği this pull request itibariyle bu sorun çözülmüştür.

Sadece/klon sonra $ mvn -DskipTests clean package ile (spark/README.md talimatları uygulayarak) inşa GitHub'dan (git clone git://github.com/apache/spark.git -b branch-1.3) en son sürümünü getirmesi gerekir.

Not: Maven sakat ediliyordu çünkü Spark bina belaya girdi. Bu sorunu $ update-alternatives --config mvn kullanarak ve Priority: 150 olan 'yolu' seçerek çözdüm. Explanation here. Bir model kaydetmek için

+0

Evet, bu PR gördüm, teşekkürler! Ama henüz kendimi kıvılcım oluşturmaya çalışmadım. Ayrıca Maven için bir ipucu için teşekkürler :) – artemdevel

6

bir yolu (Scala olasılıkla ancak Python benzerdir):

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

Kayıtlı model daha sonra şekilde yüklenebilir: ayrıca ilgili

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

See question

Daha fazla ayrıntı için bkz. (ref)

0

Kullanım pi modeli eğitmek için ML'de peline ve daha sonra modelleri kaydetmek ve geri okumak için MLWriter ve MLReader'ı kullanın.

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

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

teşekkürler, ama bu soru çok eski :) sorulan zamandan beri birçok şey değişti. – artemdevel