1、 根据子任务一的结果,计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户id(只考虑他俩购买过多少种相同的商品,不考虑相同的商品买了多少次),并根据Hive的dwd库中相关表或MySQL数据库shtd_store中相关表,获取到这10位用户已购买过的商品,并剔除用户6708已购买的商品,通过计算这10位用户已购买的商品(剔除用户6708已购买的商品)与用户6708已购买的商品数据集中商品的余弦相似度累加再求均值,输出均值前5商品id作为推荐使用,将执行结果截图粘贴至客户端桌面【Release\任务C提交结果.docx】中对应的任务序号下。
结果格式如下:
------------------------推荐Top5结果如下------------------------
相似度top1(商品id:1,平均相似度:0.983456)
相似度top2(商品id:71,平均相似度:0.782672)
相似度top3(商品id:22,平均相似度:0.7635246)
相似度top4(商品id:351,平均相似度:0.7335748)
相似度top5(商品id:14,平均相似度:0.522356)
该题最主要考察的是对余弦相似度的计算
余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向量根据坐标值,绘制到向量空间中,如最常见的二维空间。
在spark种有多种计算余弦相似度的方法,本文为大家提供2种算法
- 根据公式计算
val v1 = Array(
1.0, 2.0, 3.0
)
val v2 = Array(
2.0, 2.0, 3.0
)
println(
v1.zip(v2).map(i => i._1 * i._2).sum
/
(Math.sqrt(v1.map(Math.pow(_, 2)).sum) * Math.sqrt(v2.map(Math.pow(_, 2)).sum))
)
- 根据余弦距离
cosineDistance 方法有时候idea自动导入不了,所以需要手动引入包 :breeze.linalg.functions.cosineDistance
println(1 - cosineDistance(DenseVector(v1), DenseVector(v2)))
代码实现
- 导包
import java.util.Properties
import org.apache.spark.ml.{
Pipeline, linalg}
import org.apache.spark.ml.feature.{
LabeledPoint, Normalizer, VectorAssembler}
import org.apache.spark.ml.linalg.{
DenseVector, SparseVector}
import org.