我有这个型号:
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
,这只会在尝试广播时产生同样的错误。
我在想吗?我最终可以推荐所有人然后过滤,但我真的试图避免因为大量的物品而推荐每件商品。
提前致谢!
答案 0 :(得分:0)
我认为没有办法从工作者调用recommendUsers
,因为它最终调用需要SparkContext作为参数的callJavaFunc
。如果target_items
足够小,您可以在驱动程序的循环中调用recommendUsers
(这将是预测所有用户然后过滤的相反极端。)
或者,您看过predictAll
了吗?粗略地说,您可以为目标项目的所有用户运行预测,然后自己对它们进行排名。