Spark基于ALS推荐算法实现商品推荐实战Demo(Java版/Scala版)
时间:2018-12-18
本文章向大家介绍Spark基于ALS推荐算法实现商品推荐实战Demo(Java版/Scala版),主要包括Spark基于ALS推荐算法实现商品推荐实战Demo(Java版/Scala版)使用实例、应用技巧、基本知识点总结和需要注意事项内容推荐算法java实战内容推荐算法java实战 Spark基于ALS推荐算法实现商品推荐实战Demo(Java版/Scala版),具有一定的参考价值内容推荐算法java实战,需要的朋友可以参考一下。
Spark基于ALS推荐算法实现商品推荐实战Demo(Java版/Scala版)一、数据集准备
1,1,5
1,2,3.5
1,4,1.2
1,6,0
2,1,4.5
2,2,3.6
2,3,4.9
3,3,5.0
3,4,2.0
3,5,5.0
3,6,1.9
4,2,3.3
4,5,4.6
4,6,0
5,2,2.5
5,3,4.2
5,4,3.7
二、代码部分Java版本
package top.it1002.spark.ml.Recommend;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import org.apache.spark.mllib.recommendation.ALS;
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel;
import org.apache.spark.mllib.recommendation.Rating;
import org.apache.spark.rdd.RDD;
import [scala][4].Tuple2;
/**
* @Author 王磊
* @Date 2018/12/18
* @ClassName ALSRecommendJava
* @Description Java版ALS推荐算法demo
**/
public class ALSRecommendJava {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setAppName("als").setMaster("local[5]");
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD lines = jsc.textFile("C:\\Users\\asus\\Desktop\\data\\Recommend.txt");
// 映射
RDD ratingRDD = lines.map(new Function() {
public Rating call(String line) throws Exception {
String[] arr = line.split(",");
return new Rating(new Integer(arr[0]), new Integer(arr[1]), Double.parseDouble(arr[2]));
}
}).rdd();
MatrixFactorizationModel model = ALS.train(ratingRDD, 10, 10);
// 通过原始数据进行测试
JavaPairRDD testJPRDD = ratingRDD.toJavaRDD().mapToPair(new PairFunction() {
public Tuple2 call(Rating rating) throws Exception {
return new Tuple2(rating.user(), rating.product());
}
});
// 对原始数据进行推荐值预测
JavaRDD predict = model.predict(testJPRDD);
System.out.println("原始数据测试结果为:");
predict.foreach(new VoidFunction() {
public void call(Rating rating) throws Exception {
System.out.println("UID:" + rating.user() + ",PID:" + rating.product() + ",SCORE:" + rating.rating());
}
});
// 向指定id的用户推荐n件商品
Rating[] predictProducts = model.recommendProducts(1, 3);
System.out.println("\r\n向指定id的用户推荐n件商品");
for(Rating r1:predictProducts){
System.out.println("UID:" + r1.user() + ",PID:" + r1.product() + ",SCORE:" + r1.rating());
}
// 向指定id的商品推荐给n给用户
Rating[] predictUsers = model.recommendUsers(2, 4);
System.out.println("\r\n向指定id的商品推荐给n给用户");
for(Rating r1:predictProducts){
System.out.println("UID:" + r1.user() + ",PID:" + r1.product() + ",SCORE:" + r1.rating());
}
// 向所有用户推荐N个商品
RDD predictProductsForUsers = model.recommendProductsForUsers(3);
System.out.println("\r\n******向所有用户推荐N个商品******");
predictProductsForUsers.toJavaRDD().foreach(new VoidFunction() {
public void call(Tuple2 tuple2) throws Exception {
System.out.println("以下为向id为:" + tuple2._1 + "的用户推荐的商品:");
for(Rating r1:tuple2._2){
System.out.println("UID:" + r1.user() + ",PID:" + r1.product() + ",SCORE:" + r1.rating());
}
}
});
// 将所有商品推荐给n个用户
RDD predictUsersForProducts = model.recommendUsersForProducts(2);
System.out.println("\r\n******将所有商品推荐给n个用户******");
predictUsersForProducts.toJavaRDD().foreach(new VoidFunction() {
public void call(Tuple2 tuple2) throws Exception {
System.out.println("以下为向id为:" + tuple2._1 + "的商品推荐的用户:");
for(Rating r1:tuple2._2){
System.out.println("UID:" + r1.user() + ",PID:" + r1.product() + ",SCORE:" + r1.rating());
}
}
});
}
}
Scala版本
<p><pre>package top.it1002.spark.ml.Recommend
import org.apache.spark.mllib.recommendation.{ALS, Rating}
import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}
/**
- @Author 王磊
- @Date 2018/12/18
- @ClassName ALSRecommendJava
- @Description Scala版ALS推荐算法demo
**/
object ALSRecommendScala {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("als").setMaster("local[3]")
val session = SparkSession.builder().config(conf).getOrCreate()
val lines = session.sparkContext.textFile("C:\\Users\\asus\\Desktop\\data\\Recommend.txt")
val trainRDD = lines.map{
lines =>
val arr = lines.split(",")
Rating(arr(0).toInt, arr(1).toInt, arr(2).toDouble)
}
// 训练数据生成模型
val model = ALS.train(trainRDD, 10, 10)
// 使用原始数据生成测试数据
val testRDD = trainRDD.map{
case Rating(uid, pid, score) => (uid, pid)
}
// val predict = model.predict(testRDD)
// predict.foreach(println)
// 推荐n件商品给指定id的用户(给id为1的用户推荐五件商品)
val predictProducts = model.recommendProducts(1, 5)
println("==推荐n件商品给指定id的用户==")
predictProducts.foreach{
case Rating(uid, pid, score) => println("UID:" + uid + ",SCORE:" + pid, score)
}
// 推荐指定id的商品给n个用户(id为2的商品推荐给三个用户)
val predictUsers = model.recommendUsers(2, 3)
println("\r\n==推荐指定id的商品给n个用户==")
predictUsers.foreach{
case Rating(uid, pid, score) => println("UID:" + uid + ",SCORE:" + pid, score)
}
// 推荐n件商品给所有用户(四件商品)
val predictProductsForUsers = model.recommendProductsForUsers(4)
predictProductsForUsers.foreach{
t =>
println("\r\n向id为:" + t._1 + "的用户推荐了以下四件商品:")
for(i
println("\r\n向id为:" + t._1 + "的商品推荐了以下三个用户:")
for(i