第十一篇|基于SparkSQL的电影分析项目实战

在之前的分享中,曾系统地介绍了Spark的基本原理和使用方式,感兴趣的可以翻看之前的分享文章。在本篇分享中,将介绍一个完整的项目案例,该案例会真实还原企业中SparkSQL的开发流程,手把手教你构建一个基于SparkSQL的分析系统。为了讲解方便,我会对代码进行拆解,完整的代码已上传至GitHub,想看完整代码可以去clone,记得给个Star。以下是全文,希望本文对你有所帮助。

https://github.com/jiamx/spark_project_practise

公众号『大数据技术与数仓』,回复『资料』领取大数据资料包

项目介绍

数据集介绍

使用MovieLens的名称为ml-25m.zip的数据集,使用的文件时movies.csvratings.csv,上述文件的下载地址为:

http://files.grouplens.org/datasets/movielens/ml-25m.zip
  • movies.csv

该文件是电影数据,对应的为维表数据,大小为2.89MB,包括6万多部电影,其数据格式为[movieId,title,genres],分别对应**[电影id,电影名称,电影所属分类]**,样例数据如下所示:逗号分隔

1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
  • ratings.csv

该文件为定影评分数据,对应为事实表数据,大小为646MB,其数据格式为:[userId,movieId,rating,timestamp],分别对应**[用户id,电影id,评分,时间戳]**,样例数据如下所示:逗号分隔

1,296,5,1147880044

项目代码结构

需求分析

  • 需求1:查找电影评分个数超过5000,且平均评分较高的前十部电影名称及其对应的平均评分

  • 需求2:查找每个电影类别及其对应的平均评分

  • 需求3:查找被评分次数较多的前十部电影

代码讲解

  • DemoMainApp

该类是程序执行的入口,主要是获取数据源,转换成DataFrame,并调用封装好的业务逻辑类。

object DemoMainApp {
   
  // 文件路径
  private val MOVIES_CSV_FILE_PATH = "file:///e:/movies.csv"
  private val RATINGS_CSV_FILE_PATH = "file:///e:/ratings.csv"

  def main(args: Array[String]): Unit = {
   
    // 创建spark session
    val spark = SparkSession
      .builder
      .master("local[4]")
      .getOrCreate
    // schema信息
    val schemaLoader = new SchemaLoader
    // 读取Movie数据集
    val movieDF = readCsvIntoDataSet(spark, MOVIES_CSV_FILE_PATH, schemaLoader.getMovieSchema)
    // 读取Rating数据集
    val ratingDF = readCsvIntoDataSet(spark, RATINGS_CSV_FILE_PATH, schemaLoader.getRatingSchema)

    // 需求1:查找电影评分个数超过5000,且平均评分较高的前十部电影名称及其对应的平均评分
    val bestFilmsByOverallRating = new BestFilmsByOverallRating
    //bestFilmsByOverallRating.run(movieDF, ratingDF, spark)

    // 需求2:查找每个电影类别及其对应的平均评分
    val genresByAverageRating = new GenresByAverageRating
    //genresByAverageRating.run(movieDF, ratingDF, spark)

    // 需求3:查找被评分次数较多的前十部电影
    val mostRatedFilms = new MostRatedFilms
    mostRatedFilms.run(movieDF, ratingDF, spark)

    spark.close()

  }
  /**
    * 读取数据文件,转成DataFrame
    *
    * @param spark
    * @param path
    * @param schema
    * @return
    */
  def readCsvIntoDataSet(spark: SparkSession, path: String, schema: StructType) = {
   

    val dataSet = spark.read
      .format("csv")
      .option("header", "true")
      .schema(schema)
      .load(path)
    dataSet
  }
}
  • Entry

该类为实体类,封装了数据源的样例类和结果表的样例类

class Entry {
   

}

case class Movies(
                   movieId: String, // 电影的id
                   title: String, // 电影的标题
                   genres: String // 电影类别
                 )

case class Ratings(
                    userId: String, // 用户的id
                    movieId: String, // 电影的id
                    rating: String, // 用户评分
                    timestamp: String // 时间戳
                  )

// 需求1MySQL结果表
case class tenGreatestMoviesByAverageRating(
                                             movieId: String, // 电影的id
                                             title: String, // 电影的标题
                                             avgRating: String // 电影平均评分
                                           )

// 需求2MySQL结果表
case class topGenresByAverageRating(
                                     genres: String, //电影类别
                                     avgRating: String 
  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
首先,我们需要准备好NBA球员的数据。可以从官方网站或其他数据来源中获取。假设我们已经有了一个包含NBA球员数据的CSV文件,其中每一行包含一个球员的各种统计数据,如得分、篮板、助攻等。 接下来,我们需要使用SparkSQL来读取CSV文件,并将其转换为DataFrame。可以使用以下代码: ```python from pyspark.sql import SparkSession # 创建SparkSession spark = SparkSession.builder.appName("NBA Player Analysis").getOrCreate() # 读取CSV文件并转换为DataFrame df = spark.read.format("csv").option("header", "true").load("nba_players.csv") ``` 现在,我们可以使用SparkSQL来查询和分析NBA球员数据。以下是一些可能的查询示例: 1. 统计每个球员的得分、篮板、助攻等指标的平均值、最大值和最小值。 ```python df.createOrReplaceTempView("nba_players") result = spark.sql("SELECT Name, AVG(PTS) AS AvgPts, MAX(REB) AS MaxReb, MIN(AST) AS MinAst FROM nba_players GROUP BY Name") result.show() ``` 2. 统计每个位置(前锋、中锋、后卫)的球员数和他们的平均得分。 ```python df.createOrReplaceTempView("nba_players") result = spark.sql("SELECT Position, COUNT(*) AS Count, AVG(PTS) AS AvgPts FROM nba_players GROUP BY Position") result.show() ``` 3. 找出得分最高的前10名球员。 ```python df.createOrReplaceTempView("nba_players") result = spark.sql("SELECT Name, PTS FROM nba_players ORDER BY PTS DESC LIMIT 10") result.show() ``` 以上仅是一些使用SparkSQL进行NBA球员数据分析的示例。根据具体需求,我们可以进行更复杂、更细致的分析和查询。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值