尝试使用Spark MLLib的ALS构建推荐系统。
目前,我们正在尝试每天为所有用户预建建议。我们使用简单的隐式反馈和ALS。
问题是,我们有20M用户和30M产品,并且要调用主要的predict()方法,我们需要为用户和产品进行笛卡尔联接,这太大了,并且可能需要数天才能生成加入。有没有办法避免笛卡尔联合使这个过程更快?
目前我们有8个带64Gb RAM的节点,我认为它应该足够用于数据。
val users: RDD[Int] = ??? // RDD with 20M userIds
val products: RDD[Int] = ??? // RDD with 30M productIds
val ratings : RDD[Rating] = ??? // RDD with all user->product feedbacks
val model = new ALS().setRank(10).setIterations(10)
.setLambda(0.0001).setImplicitPrefs(true)
.setAlpha(40).run(ratings)
val usersProducts = users.cartesian(products)
val recommendations = model.predict(usersProducts)
答案 0 :(得分:1)
不确定您是否真的需要整个20M x 30M矩阵。如果您只想为每个用户预先构建产品推荐,可以尝试recommendProducts(user: Int, num: Int)
所有用户,将自己限制在num
最强的推荐内容。还有recommendUsers()
。