DataFrame API 实战

spark版本:2.2.0
数据集…这是练习CF的数据集…直接拿来用了
MovieLens 1M Dataset

文本格式:
users.dat
UserID::Gender::Age::Occupation::Zip-code

movies.dat
MovieID::Title::Genres

ratings.dat
UserID::MovieID::Rating::Timestamp

因为SparkSession对读取文本支持的不是很好,所以采用样例类将rdd转换为df来操作


import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

case class Users(UserID:Int,Gender:String,Age:Int,Occupation:Int,Zip_code :String)
case class Movies(MovieID:String,Title:String,Genres:String)
case class Ratings(UserID:Int,MovieID:String,Rating:Double,Timestamp:String)

object Test {
  def main(args: Array[String]): Unit = {
    val session = SparkSession.builder().master("local[2]").appName(this.getClass.getName).getOrCreate()
    val sc = session.sparkContext
    import session.implicits._
    val movie: RDD[String] = sc.textFile("src/file/ml-1m/movies.dat")
    val movies: DataFrame = movie.map(_.split("::")).map(line =>Movies(line(0),line(1),line(2))).toDF

    val rate: RDD[String] = sc.textFile("src/file/ml-1m/ratings.dat")
    val ratings: DataFrame = rate.map(_.split("::")).map(line=>Ratings(line(0).toInt,line(1),line(2).toDouble,line(3))).toDF

    val user: RDD[String] = sc.textFile("src/file/ml-1m/users.dat")
    val users: DataFrame = user.map(_.split("::")).map(line=>Users(line(0).toInt,line(1),line(2).toInt,line(3).toInt,line(4))).toDF


    // 年龄段在“18-24”的男性年轻人,最喜欢看哪10部电影
    val userFilter = users.filter($"Age">=18 and($"Age"<=30) and($"Gender"==="M")).toDF()
    ratings.join(userFilter,Seq("UserID")).groupBy($"MovieID").count.sort(-$"count").limit(10)


    // 得分最高的10部电影
    val ratingFilter: DataFrame = ratings.select($"MovieID",$"Rating")
    val ratingAgg: DataFrame = ratingFilter.groupBy("MovieID").agg("Rating"->"count","Rating"->"sum").withColumnRenamed("sum(Rating)","sumRating").withColumnRenamed("count(Rating)","countRating")
    val top10: Dataset[Row] = ratingAgg.select($"MovieID",$"sumRating"/$"countRating" as("avgScore")).sort(-$"avgScore").limit(10)
    movies.join(top10,Seq("MovieID")).select($"Title").show(10,false)


    //看过电影最多的前10个人
   ratings.groupBy("UserID").count().sort(-$"count").limit(10).show()


    //男性看过最多的10部电影
    val man: DataFrame = users.filter($"Gender"==="M").select("UserID")
    val manTop10: Dataset[Row] = man.join(ratings,Seq("UserID")).groupBy($"MovieID").agg("UserID"->"count").withColumnRenamed("count(UserID)","manCount").sort(-$"manCount").limit(10)
    manTop10.join(movies,Seq("MovieID")).select("Title").show()



  }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值