第四部分-推荐系统-离线推荐
- 本模块基于第4节得到的模型,开始为用户做离线推荐,推荐用户最有可能喜爱的5部电影。
说明几点
1.主要分为两个模块。其一是为 单个随机用户 做推荐,其二是为 所有用户做推荐,并将推荐结果进行保存
2. 其中所有推荐的结果保存在 MySQL中,HBase,Hive中 <三种版本>。
3. 其中取得的userid一定要存在于模型中, 这样就建议直接从trainingData中取。
1.为某一用户产生推荐结果
开始模块一Coding
步骤一: 继续在前面的项目中,新建config包,新建AppConf接口
为了代码不要那么冗余,我们抽离一个接口出来
package com.csylh.recommend.config
import java.util.Properties
import org.apache.spark.sql.SparkSession
/**
* Description: 后续ETL操作或者其他操作必须要实现的trait
*
* @Author: 留歌36
* @Date: 2019-07-17 16:53
*/
trait AppConf {
val localMasterURL = "local[2]"
val clusterMasterURL = "spark://hadoop001:7077"
// 面向SparkSession编程
val spark = SparkSession.builder()
// .master(localMasterURL)
.enableHiveSupport() //开启访问Hive数据, 要将hive-site.xml等文件放入Spark的conf路径
.getOrCreate()
val sc = spark.sparkContext
// 设置RDD的partitions 的数量一般以集群分配给应用的CPU核数的整数倍为宜, 4核8G ,设置为8就可以
// 问题一:为什么设置为CPU核心数的整数倍?
// 问题二:数据倾斜,拿到数据大的partitions的处理,会消耗大量的时间,因此做数据预处理的时候,需要考量会不会发生数据倾斜
val minPartitions = 8
// 在生产环境中一定要注意设置spark.sql.shuffle.partitions,默认是200,及需要配置分区的数量
val shuffleMinPartitions = "8"
spark.sqlContext.setConf("spark.sql.shuffle.partitions",shuffleMinPartitions)
//jdbc连接
val jdbcURL = "jdbc:mysql://hadoop001:3306/recommend?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
val alsTable = "recommend.alsTab"
val recResultTable = "recommend.similarTab"
val top5Table = "recommend.top5Result"
val userTable= "recommend.user"
val ratingTable= "recommend.rating"
val mysqlusername = "root"
val mysqlpassword = "123456"
val prop = new Properties
prop.put("driver", "com.mysql.jdbc.Driver")
prop.put("user", mysqlusername)
prop.put("password", mysqlpassword)
}
步骤二: 新建Recommender
package com.csylh.recommend.ml
import com