pyspark - 在RDD的map函数中使用MatrixFactorizationModel

时间:2017-03-09 12:59:18

标签: apache-spark pyspark apache-spark-mllib

我有这个型号:

from pyspark.mllib.recommendation import ALS

model = ALS.trainImplicit(ratings,
                              rank,
                              seed=seed,
                              iterations=iterations,
                              lambda_=regularization_parameter,
                              alpha=alpha)

我已成功使用它以简单的方法向用户推荐所有产品:

recRDD = model.recommendUsersForProducts(number_recs)

现在,如果我只想推荐一组项目,我首先加载目标项目:

target_items = sc.textFile(items_source)

然后映射recommendUsers()函数,如下所示:

recRDD = target_items.map(lambda x: model.recommendUsers(int(x), number_recs))

我尝试任何操作后失败,出现以下错误:

It appears that you are attempting to reference SparkContext from a broadcast variable, action, or transformation. SparkContext can only be used on the driver, not in code that it run on workers. For more information, see SPARK-5063.

我在本地尝试此操作,因此在运行客户端或群集模式时,我不确定此错误是否仍然存在。我试图广播model,这只会在尝试广播时产生同样的错误。

我在想吗?我最终可以推荐所有人然后过滤,但我真的试图避免因为大量的物品而推荐每件商品。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我认为没有办法从工作者调用recommendUsers,因为它最终调用需要SparkContext作为参数的callJavaFunc。如果target_items足够小,您可以在驱动程序的循环中调用recommendUsers(这将是预测所有用户然后过滤的相反极端。)

或者,您看过predictAll了吗?粗略地说,您可以为目标项目的所有用户运行预测,然后自己对它们进行排名。