面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析_每个类型评分前10的电影 spark(1)

本文介绍了作者使用Spark对电影评分数据进行分析的过程,包括创建数据库表结构、执行SQL查询来满足三个需求(高评分电影、平均评分按类别、评分次数最多的电影),以及数据加载和处理。
摘要由CSDN通过智能技术生成
+ [数据介绍:使用的文件movies.csv和ratings.csv](#moviescsvratingscsv_18)
+ [建表语句](#_29)
+ [项目结构一览图](#_91)
+ [由题意可知](#_93)
+ [总结](#_331)

引言

大家好,我是ChinaManor,直译过来就是中国码农的意思,俺希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。

在这里插入图片描述
Spark综合练习——电影评分数据分析
在这里插入图片描述

这是我的上篇博文,当时仅是做了一个实现案例(demo级别 ),没想到居然让我押中了题,还让我稳稳的及格了(这次测试试卷难度极大,考60分都能在班上排进前10)
不过我在复盘的时候,发现自己的致命弱点:写sql的能力太菜了。。在这里插入图片描述
于是我重做了一遍,并满足了导师提的3个需求:

需求1: 查找电影评分个数超过50,且平均评分较高的前十部电影名称及其对应的平均评分
需求2: 查找每个电影类别及其对应的平均评分
需求3: 查找被评分次数较多的前十部电影

数据介绍:使用的文件movies.csv和ratings.csv

movies.csv该文件是电影数据,对应的为维表数据,其数据格式为
movieId title genres
电影id 电影名称 电影所属分类
样例数据如下所示:逗号分隔
1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy

ratings.csv该文件为定影评分数据,其数据格式为
userId movieId rating timestamp
电影id 电影名称 电影所属分类 时间戳

建表语句

CREATE DATABASE db_movies;
USE db_movies;
CREATE TABLE `ten_movies_avgrating` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',

  `movieId` int(11) NOT NULL COMMENT '电影id',

  `ratingNum` int(11) NOT NULL COMMENT '评分个数',

  `title` varchar(100) NOT NULL COMMENT '电影名称',

  `avgRating` decimal(10,2) NOT NULL COMMENT '平均评分',

  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `movie_id_UNIQUE` (`movieId`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `genres_average_rating` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',

  `genres` varchar(100) NOT NULL COMMENT '电影类别',

  `avgRating` decimal(10,2) NOT NULL COMMENT '电影类别平均评分',

  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `genres_UNIQUE` (`genres`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `ten_most_rated_films` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',

  `movieId` int(11) NOT NULL COMMENT '电影Id',

  `title` varchar(100) NOT NULL COMMENT '电影名称',

  `ratingCnt` int(11) NOT NULL COMMENT '电影被评分的次数',

  `update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;




项目结构一览图

在这里插入图片描述

由题意可知

先创建实体类,字段是从建表语句中得来的。
在这里插入图片描述
Entry.scala

package cn.movies.Packet

/\*\*
 \* @author ChinaManor
 \* #Description Entry
 \* #Date: 6/6/2021 17:23
 \*/
object 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
                                               ratingNum:String,
                                               title: String, // 电影的标题
                                               avgRating: String // 电影平均评分
                                             )
  // 需求2MySQL结果表
  case class topGenresByAverageRating(
                                       genres: String, //电影类别
                                       avgRating: String // 平均评分
                                     )
  // 需求3MySQL结果表
  case class tenMostRatedFilms(
                                movieId: String, // 电影的id
                                title: String, // 电影的标题
                                ratingCnt: String // 电影被评分的次数
                              )
}

再创建个表结构~~在这里插入图片描述
Schema.scala

package cn.movies.Packet

import org.apache.spark.sql.types.{DataTypes, StructType}

/\*\*
 \* @author ChinaManor
 \* #Description Schema
 \* #Date: 6/6/2021 17:34
 \*/
object Schema {
  class SchemaLoader {

    // movies数据集schema信息

    private val movieSchema = new StructType()
      .add("movieId", DataTypes.StringType, false)
      .add("title", DataTypes.StringType, false)
      .add("genres", DataTypes.StringType, false)
    // ratings数据集schema信息

    private val ratingSchema = new StructType()

      .add("userId", DataTypes.StringType, false)
      .add("movieId", DataTypes.StringType, false)
      .add("rating", DataTypes.StringType, false)
      .add("timestamp", DataTypes.StringType, false)

    def getMovieSchema: StructType = movieSchema
    def getRatingSchema: StructType = ratingSchema
  }
}


然后开始写Main方法,其实只有区区八十行代码。。。

spark总要有实例对象吧。

// 创建spark session
    val spark = SparkSession
      .builder
      .appName(this.getClass.getSimpleName.stripSuffix("$"))
      .master("local[4]")
      .getOrCreate

然后 new个schema信息

val schemaLoader = new SchemaLoader

然后尝试读取csv文件,
// 读取Movie数据集
val movieDF: DataFrame = readCsvIntoDataSet(spark, MOVIES_CSV_FILE_PATH, schemaLoader.getMovieSchema)
// 读取Rating数据集
val ratingDF: DataFrame = readCsvIntoDataSet(spark, RATINGS_CSV_FILE_PATH, schemaLoader.getRatingSchema)

发现读取方法和路径都没有,于是补救一下

  // 文件路径
  private val MOVIES_CSV_FILE_PATH = "D:\\Users\\Administrator\\Desktop\\exam0601\\datas\\movies.csv"
  private val RATINGS_CSV_FILE_PATH = "D:\\Users\\Administrator\\Desktop\\exam0601\\datas\\ratings.csv"



![img](https://img-blog.csdnimg.cn/img_convert/ea43c1f3523284f8fda1ede02811ebec.png)
![img](https://img-blog.csdnimg.cn/img_convert/ae51e7e6f59bf0951e217f22bc85d971.png)
![img](https://img-blog.csdnimg.cn/img_convert/4cf8e7e69c7ecb9f42624e17a0a3f46a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

714341683965)]
[外链图片转存中...(img-ZnKqFdGL-1714341683965)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值