spark深度学习例子音乐推荐代码

来源:互联网 发布:产品说明书排版软件 编辑:程序博客网 时间:2024/06/07 06:28
object MusicRecommend {    def musicRecommend()={        val conf = new SparkConf().setAppName("musicRecommend")        val sc = new SparkContext(conf)//      处理艺术家数据         val rawArtistData = sc.textFile("ds/artist", 4)//      由于文件存在非法行 不是用\t分割的        /*val aritstByID = rawArtistData.map{ l =>             val (id,name) = l.span(_ != "\t")            (id.toInt,name.trim())          }*/        val artistByID = rawArtistData.flatMap{line =>            val (id,name) = line.span(_ != '\t')                if(name.isEmpty()) None            else                 try{                    Some((id.toInt,name.trim()))                }catch{                    case e :Exception => None                }        }//      处理艺术家别名数据        val rawArtistAlias = sc.textFile("ds/alias")        val artistAlias = rawArtistAlias.flatMap{ line =>            val tokens=line.trim().split("\\s+")            if(tokens.length != 2){                None            }else{                Some((tokens(0).toInt,tokens(1).toInt))            }        }.collectAsMap()//      这里使用广播变量,spark执行一个stage阶段时,会为执行函数建立一个闭包,//      也就是所有任务需要的信息的2进制形式。闭包包含了函数引用的所有数据结构。//      spark把这个闭包发送到集群上每个executor上.//      当许多任务使用同一个不可变的数据结构时,我们应该使用广播变量。//      好处是可以在多个作业和阶段stage之间缓存数据        val bArtistAlias = sc.broadcast(artistAlias)//      处理用户收听记录        val rawUserArtistData = sc.textFile("ds/user*")//      生成训练数据        val trainData = rawUserArtistData.map{ line =>            val Array(userID,artistID,count) = line.split("\\s+").map(_.toInt)            val finalArtistID=bArtistAlias.value.getOrElse(artistID, artistID)            Rating(userID,finalArtistID,count)        }.cache()//      使用训练数据进行训练//      MatrixFactorizationModel 其他的参数都是超参数 其值直接影响到最终结果        val model = ALS.trainImplicit(trainData, 10, 5, 0.01, 1.0)//      检查推荐结果是否合理        val userId = 2093760        val rcNum = 5//      1.获取用户2093760的数据        val rawArtistsForUser = rawUserArtistData.map(_.split("\\s+"))            .filter{case Array(user,_,_) => user.toInt == userId}//      2.获取用户2093760感兴趣的艺术家集        val existingProducts = rawArtistsForUser.map {case Array(_,artist,_) => artist.toInt}            .collect.toSet//      3.找到该艺术家对应的名称,并打印        artistByID.filter{case (id,name) =>                    existingProducts.contains(id)            }.values.collect.foreach(println)//      获取该用户的几个推荐结果        val recommendations = model.recommendProducts(userId, rcNum)//      打印推荐结果        recommendations.foreach(println)//      结果构成Rating(userid,artistID,rating)rating表示一个数值,其值越接近1表示推荐结果越好    }}