代码:
package com.lbw
import java.io.File
import org.apache.log4j.Logger
import org.apache.log4j.Level
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd._
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import scala.collection.immutable.Map
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating
import scala.util.control.Breaks._
object sparkDemo {
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.OFF) //设置代码打印级别,过滤掉多余的日志
Logger.getLogger("com").setLevel(Level.OFF)
System.setProperty("spark.ui.showConsoleProgress","false")
Logger.getRootLogger().setLevel(Level.OFF)
val sc=new SparkContext(new SparkConf().setAppName("wordcount").setMaster("local[4]")) //设置运行环境
val textFile=sc.textFile("hdfs://spark1:9000/swun/data/u.data")
val movieRDD=sc.textFile("hdfs://spark1:9000/swun/data/u.item")
val rawRating=textFile.map(_.split("\t").take(3)) //选择数据
val ratingRDD=rawRating.map{case Array(user,movie,rating)=>Rating(user.toInt,movie.toInt,rating.toDouble)}
println("--------开始训练模型----------")
val model=ALS.train(ratingRDD, 10, 10,0.01)
println("--------模型训练结束----------")
println("--------开始推荐阶段----------")
println("请选择推荐的类型:1:针对用户推荐电影2:针对电影推荐用户,3:退出")
var choose=readInt()
while(choose!=3){
if(choose==1){
print("请输入用户id:")
val inputUserId=readInt()
//调用根据用户推荐电影的方法
user_product(inputUserId,model,movieRDD)
}else if(choose==2){
print("请输入电影id:")
val inputMovieId=readInt()
//调用根据电影推荐用户的方法
product_user(inputMovieId,model,movieRDD)
}
println("请选择推荐的类型:1:针对用户推荐电影2:针对电影推荐用户,3:退出")
choose=readInt()
}
}
def user_product(userId:Int,model:MatrixFactorizationModel,movieRDD:RDD[String]){ //根据用户推荐电影的方法
val movieTotol=movieRDD.map(_.split("\\|").take(2)).map(array=>(array(0).toInt,array(1).toString)).collectAsMap()
val movieMap=model.recommendProducts(userId,5)
var i=1
println("针对用户ID:"+userId+",推荐以下五部电影")
movieMap.foreach{r =>println(i.toString()+".推荐电影名称:"+movieTotol(r.product)+", 评分:"+r.rating);i=i+1}
println("产品推荐结束")
}
def product_user(productId:Int,model:MatrixFactorizationModel,movieRDD:RDD[String]){ //根据电影推荐用户的方法
val movieTotol=movieRDD.map(_.split("\\|").take(2)).map(array=>(array(0).toInt,array(1).toString)).collectAsMap()
val userMap=model.recommendUsers(productId, 5)
var j=1
println("针对电影ID:"+productId+",电影名称:"+movieTotol(productId)+"推荐以下五名用户")
userMap.foreach{i=>println(j+". 推荐用户ID:"+i.user+", 推荐电影评分:"+i.rating);j=j+1}
println("用户推荐结束")
}
}
代码运行截图: