Я работаю над тем, чтобы сохранить свою модель после конвейера в pyspark 2.4, чтобы позже я смог вспомнить свою модель.Я столкнулся с проблемой при попытке сохранить свою модель, и более короткая версия моего кода выглядит следующим образом:
Функция обучения
def main(spark, train_file, model_path):
train = spark.read.parquet(train_file)
indexer = StringIndexer(...) # convert the string to numerical representation
als = ALS(...) # this is my ALS model with hand put toy case
pipeline = Pipeline(stages = [indexer,als])
model = pipeline.fit(train) # now fit this pipeline to my training data
model.write.overwrite().save(model_path)
if __name__ == "__main__":
# Create the spark session object
spark= SparkSession.builder.appName('an_example').getOrCreate()
# Get the filename from the command line
train_file = sys.argv[1]
model_file = sys.argv[2]
# Call our main routine
main(spark,train_file, model_file)
Тестированиеfunction
def main(spark, model_path, test_file):
test = spark.read.parquet(test_file)
model = Pipeline.load(model_path)
# call an attribute from model
userRecs = model.recommendForAllusers(10)
if __name__ == "__main__":
# repeat of what I have up there, with a new appName created
Теперь каждый раз, когда я вызываю ее, я сталкиваюсь со следующей ошибкой:
AttributeError: у объекта PipelineModel нет атрибута RecommendedAllUsers 1013*
Несколько попыток исправить ошибку Я полагаю, что ошибка происходит, потому что теперь моя модель является объектом PipelineModel, чтобы вернуться обратно в объект модели, мне нужно изменить как я сохраняю свою модель
Первая попытка:
sc = SparkContext.getOrCreate()
model.save(sc, model_file)
TypeError: save () принимает 2 позиционных аргумента, но 3 получили
Это потому, что у моего sc
есть два компонента: <SparkContext master=yarn appName=an_example>
Вторая попытка: совмещать тренировку и тестирование: Удивительно, но если я позвоню model.recommendForAllusers
сразу после того, как подгоняю model = pipeline.fit(train)
, он все равновыдает мне ту же ошибку атрибута!
Теперь я застрял.Есть два вопроса Я хотел бы знать о:
(1), как правильно сохранить модель с искровым контекстом sc?
(2)Я думаю, что есть несколько способов правильно вызвать модель и при этом иметь доступ к атрибутам модели.Я думаю, что если я исправлю свою проблему в (1), я смогу позвонить по model = als.load(sc,model_path)
, а остальная часть кода будет работать нормально.Но я бы хотел получить подтверждение.