user CF是基于相似用户的推荐方法,实现这种推荐的基本思路是:计算出相似用户得分,获取相似用户的物品集合的打分,最后两个得分相乘,得出相似用户推荐的物品集合topN。
实这种推荐可以使用公式余弦相似:cosine= a*b/(|a|*|b|)
具体思路和步骤如下:
一.从hive中获取数据:(hive建表,user_id、item_id、rating、timestamp)
启动spark ./sbin/start-all
启动spark-shell ./bin/spark-shell
val df = spark.sql(select * from default.udata)
二.计算相似用户:
1. 先计算分母:|a| = sqrt(a1^2+a2^2+a3^2+.....+an^2),
把导入的表格变成RDD,取出user_id和rating,以用户为groupBy,把该用户的所有打分数据平方再相加再开根号,最后再转换为dataframe,使用RDD的目的是更加方便操作,最后转换为dataframe的目的是可视化更好,在后期的使用中也非常便利,在转换中要导入隐式转换(import spark.implicits._)
2.第二步计算分子:a*b
先需要一张新表,
val df = udata.selectExpr("user_id as user_v","item_id as item_id","rating as rating_v")
df新表join到udata表格,filter(user_id<user_v),形成相似矩阵,计算在同一个item下的评分乘积rating*rating_v,在相乘的时候要注意类型的转换,string->double,把乘积相加,计算出完整的分子部分
3.最后把分子和分母代入,得到相似用户集合(user_id、user_v、sim_score)
三、获取相似用户的物品集合