尝试使用Spark MLLib的ALS构建推荐系统。
目前,我们正在尝试每天为所有用户预先构建推荐。我们使用简单的隐式反馈和ALS。
问题是,我们有2000万用户和3000万产品,要调用main predict()方法,我们需要有针对用户和产品的笛卡尔连接,这太大了,而且可能需要几天时间才能生成连接。有没有一种方法可以避免笛卡尔连接,让这个过程更快?
目前我们有8个节点和64 be的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)发布于 2015-04-11 23:54:32
不确定您是否真的需要整个20M x 30M矩阵。如果您只想为每个用户预先构建产品推荐,那么可以尝试针对所有用户的recommendProducts(user: Int, num: Int),将自己限制在num最强的推荐范围内。还有recommendUsers()。
https://stackoverflow.com/questions/29119858
复制相似问题