1. import org.apache.spark.SparkConf
    2. import org.apache.spark.ml.recommendation.ALS
    3. import org.apache.spark.sql.expressions.Window
    4. import org.apache.spark.sql.functions._
    5. import org.apache.spark.sql.{DataFrame, SparkSession}
    6. object helloBy {
    7. case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)
    8. def main(args: Array[String]): Unit = {
    9. // 机器学习 基于协同过滤推荐系统
    10. System.setProperty("hadoop.home.dir", "H:\\winutils\\winutils-master\\hadoop-2.6.0")
    11. val spark = SparkSession.builder().config(
    12. new SparkConf()
    13. .setMaster("local[*]")
    14. .setAppName("text")
    15. ).getOrCreate()
    16. import spark.implicits._
    17. def parseRating(str: String): Rating = {
    18. val fields = str.split("::")
    19. Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)
    20. }
    21. val ratings = spark.sparkContext.textFile("data/scala/sample_movielens_ratings.txt")
    22. .map(parseRating)
    23. .toDF()
    24. val Array(training, test) = ratings.randomSplit(Array(0.5, 0.5))
    25. // Build the recommendation model using ALS on the training data
    26. val als = new ALS()
    27. .setMaxIter(5)
    28. .setRegParam(0.01)
    29. .setUserCol("userId")
    30. .setItemCol("movieId")
    31. .setRatingCol("rating")
    32. val model = als.fit(training)
    33. // 我的思路就是评分高就推荐给用户
    34. val frame: DataFrame = model.transform(test)
    35. frame
    36. .drop("rating", "timestamp")
    37. .where($"userId" === 5 )
    38. .orderBy($"prediction".desc)
    39. .limit(5)
    40. .show(false)
    41. // 给电影推荐用户
    42. // 先获取某电影评分最高
    43. val w = Window.partitionBy($"movieId", $"userId").orderBy($"prediction".desc)
    44. frame
    45. .drop("rating", "timestamp")
    46. .where($"movieId" === 20 )
    47. .withColumn("rn", row_number().over(w)).where($"rn" === 1).drop($"rn")
    48. .orderBy($"prediction".desc)
    49. .limit(5)
    50. .select("movieId", "userId", "prediction")
    51. .show(false)
    52. }
    53. }