之前写的太简单,这次加点存储和修改点代码来做次比较完善的推荐流程,但是只是基于离线,没有写实时模块,大家可以关注,接下来有时间会写到
代码如下:
package mllib import java.text.SimpleDateFormat import java.util.Date import org.apache.log4j.{Level, Logger} import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating} import org.apache.spark.rdd.RDD import org.apache.spark.sql.SQLContext import org.apache.spark.{SparkContext, SparkConf} import util.HbaseUtils import scala.io.Source import java.util.ArrayList import scopt.OptionParser /** * Created by 汪本成 on 2016/6/23. */ object movieALS { val numRecommender = 10 def main(args: Array[String]) { //屏蔽不必要的日志显示在终端上 Logger.getLogger("org.apache.spark").setLevel(Level.WARN) Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF) //创建入口对象 val conf = new SparkConf().setAppName("moviesALS").setMaster("local[5]") val sc = new SparkContext(conf) //评分训练总的数据集,元祖格式 val ratingList_Tuple = sc.textFile("hdfs://master:9000/user/spark/test/ratings.dat").map{ lines => val fields = lines.split("::") //将timespan这列对10取余,是评分一列出现的数字都是一个0~9的数字 (fields(0).toInt, fields(1).toInt, fields(2).toDouble, fields(3).toLong % 10) } //评分训练的总数据集,模拟键值对的形式,键是0-9的一个数字,值是Rating类型 val ratingsTrain_KV = ratingList_Tuple.map(x => (x._4, Rating(x._1, x._2, x._3))) //打印从rating.dat中,我们从多少个用户和电影之中得到多少评分记录 println("统计出" + ratingsTrain_KV.count() + "条评价来自" + ratingsTrain_KV.map(_._2.user).distinct().count() + "部电影里") //我的评分数据,RDD[Rating]格式 val myRatedData_Rating = sc.textFile("hdfs://master:9000/user/spark/test/test.dat").map{ lines => val fields = lines.split("::") Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble) } //从训练总数据分出80%作为训练集,20%作为验证集,20%作为测试集,前面的将timespan对10做取余操作就是为了从总数据集分出三部分 //设置分区数 val numPartitions = 3 //将键的数值小于8的作为训练数据 val traingData_Rating = ratingsTrain_KV.filter(_._1 < 8).values //注意,由于原本的数据集是伪键值对形式的,而当做训练数据只需要RDD[Rating]类型的数据,即values集合 |