Я работаю с Spark 1.3.0, используя PySpark и MLlib, и мне нужно сохранить и загрузить свои модели. Я использую такой код (взят из официальной документации)
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) и содержат много файлов с некоторыми данными. Такое ощущение, что модели сохраняются правильно, но, вероятно, они не загружаются правильно. Я также погуглил, но не нашел ничего связанного.
Похоже, что эта функция сохранения \ загрузки была недавно добавлена в Spark 1.3.0, и из-за этого у меня есть другой вопрос - каким был рекомендуемый способ сохранения \ загрузки моделей до выпуска 1.3.0? Я не нашел хороших способов сделать это, по крайней мере, для Python. Я также попробовал Pickle, но столкнулся с теми же проблемами, что описаны здесь Сохранить Apache Spark mllib модель на питоне