SparkSQL 电影评价数据分析

简介: 当我做了很多Spark Core练习,喜欢写map、reduce,后来又开始用SparkSQL ,感觉SQL比mapReduce简洁优雅很多。SQL是我的短板,通过Spark SQL又练习了group by、join 、case when 等语法。

当我做了很多Spark Core练习,喜欢写map、reduce,后来又开始用SparkSQL ,感觉SQL比mapReduce简洁优雅很多。
SQL是我的短板,通过Spark SQL又练习了group by、join 、case when 等语法。

数据集介绍

These files contain 1,000,209 anonymous ratings of approximately 3,900 movies
made by 6,040 MovieLens users who joined MovieLens in 2000.

2000年,100万条电影评价数据集,包括3900部电影和6040个用户。

  • users.dat 格式:UserID::Gender::Age::Occupation::Zip-code
  • movies.dat 格式:MovieID::Title::Genres
  • ratings.dat 格式:UserID::MovieID::Rating::Timestamp

一、创建Dataset和Dataframe

JavaRDD<User> userRDD = spark.read().textFile("data/ml-1m/users.dat")
//返回Dataset<String>对象
.javaRDD()
//返回JavaRDD<String>对象
.map(line->{
    String[] arr = line.split("::");
    return new User(Long.parseLong(arr[0]),
            arr[1],Integer.parseInt(arr[2]),
            Integer.parseInt(arr[3]),
            arr[4]);
});
//返回JavaRDD<User>对象
Dataset<Row> userDF= spark.createDataFrame(userRDD,User.class);
//返回Dataset<Row>对象
  1. spark.read().textFile 生成Dataset<String>对象
  2. javaRDD() 生成JavaRDD<String>对象
  3. map(String->{}) 生成JavaRDD<Object>对象
  4. spark.createDataFrame(RDD,Object.class)生成Dataset<Row>对象

二、Group by 分组

统计各职业男性、女性人数

userDF.groupBy("occupation","gender")
                .agg(count("gender"))
                .orderBy("occupation")
                .show();
+----------+------+-------------+
|occupation|gender|count(gender)|
+----------+------+-------------+
|         0|     M|          479|
|         0|     F|          232|
|         1|     F|          209|
|         1|     M|          319|
|         2|     M|          176|
|         2|     F|           91|
|         3|     F|          100|
|         3|     M|           73|
|         4|     F|          234|
|         4|     M|          525|
|         5|     M|           81|
|         5|     F|           31|
|         6|     F|          102|
|         6|     M|          134|
|         7|     F|          139|
|         7|     M|          540|
|         8|     M|           14|
|         8|     F|            3|
|         9|     F|           89|
|         9|     M|            3|
+----------+------+-------------+
only showing top 20 rows

三、临时表

Dataset调用createOrReplaceTempView生成临时表,session内有效。
spark.sql执行sqll操作,可以选择创建的临时表。

userDF.createOrReplaceTempView("user");
spark.sql("select occupation,gender,count(1) from user " +
    " group by occupation,gender order by occupation desc,gender asc").show();

四、case when 实现更好的输出格式

case column 生成新的column。
sum 加和。

spark.sql("select occupation," +
        " sum(CASE gender WHEN 'F' THEN 1 ELSE 0 END)Female," +
        " sum(CASE gender WHEN 'M' THEN 1 ELSE 0 END)Male " +
        "from user group by occupation order by occupation desc").show();
+----------+------+----+
|occupation|Female|Male|
+----------+------+----+
|        20|    78| 203|
|        19|    15|  57|
|        18|     4|  66|
|        17|    52| 450|
|        16|    51| 190|
|        15|    28| 116|
|        14|    79| 223|
|        13|    34| 108|
|        12|    50| 338|
|        11|    22| 107|
|        10|    66| 129|
|         9|    89|   3|
|         8|     3|  14|
|         7|   139| 540|
|         6|   102| 134|
|         5|    31|  81|
|         4|   234| 525|
|         3|   100|  73|
|         2|    91| 176|
|         1|   209| 319|
+----------+------+----+
only showing top 20 rows

五、join 连接操作

select from tableA join tableB on tableA.XX = tableB.xx on 后面是连接条件。
用UserID连接用户表和评论表:

spark.sql("SELECT gender,age,count(*) FROM user JOIN rating " +
        "ON user.userID = rating.userID WHERE movieID=2116 GROUP BY gender,age").show();
userDF.join(ratingDF,"userID")
        .filter("movieID=2116")
        .groupBy("gender","age")
        .count().show();

Dataset用不同的列名连接:

        Dataset<Row> ratingMovie = ratingDF.join(
                movieDF,ratingDF.col("movieID").equalTo(movieDF.col("movieID")));

六、filter

Dataset的filter是条件过滤语句row->{return true/false}

ratingMovie.filter((FilterFunction<Row>) row ->{
                    if(row.getString(5).indexOf("Phantasm")>=0)
                        return true;
                    else
                        return false;
                }
        )

总结

本文通过电影数据集分析代码,介绍了SQL中join和case when 语法,和Dataset中filter示例。

目录
相关文章
|
7月前
|
数据采集 存储 数据挖掘
TMDB电影数据分析(下)
TMDB电影数据分析(下)
|
7月前
|
存储 数据采集 数据挖掘
TMDB电影数据分析(上)
TMDB电影数据分析(上)
|
4月前
|
存储 数据采集 数据可视化
基于Python flask+MySQL+echart的电影数据分析可视化系统
该博客文章介绍了一个基于Python Flask框架、MySQL数据库和ECharts库构建的电影数据分析可视化系统,系统功能包括猫眼电影数据的爬取、存储、展示以及电影评价词云图的生成。
156 1
|
4月前
|
数据采集 存储 数据可视化
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
本文介绍了一个基于Python Flask框架开发的猫眼电影票房数据分析可视化系统,该系统集成了数据爬取、存储处理、可视化展示和用户交互功能,使用户能够直观地分析和展示电影票房数据,具有高度定制性。
163 0
基于Python flask的猫眼电影票房数据分析可视化系统,可以定制可视化
|
4月前
|
机器学习/深度学习 算法 数据可视化
基于Python flask的豆瓣电影数据分析可视化系统,功能多,LSTM算法+注意力机制实现情感分析,准确率高达85%
本文介绍了一个基于Python Flask框架的豆瓣电影数据分析可视化系统,该系统集成了LSTM算法和注意力机制进行情感分析,准确率高达85%,提供了多样化的数据分析和情感识别功能,旨在帮助用户深入理解电影市场和观众喜好。
146 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的豆瓣电影数据分析可视化系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的豆瓣电影数据分析可视化系统附带文章源码部署视频讲解等
58 0
|
7月前
|
机器学习/深度学习 数据采集 数据可视化
R语言电影数据分析:随机森林探索电影受欢迎程度因素、参数调优可视化
R语言电影数据分析:随机森林探索电影受欢迎程度因素、参数调优可视化
|
7月前
|
SQL 分布式计算 数据挖掘
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
81 0
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
|
7月前
|
分布式计算 数据挖掘 关系型数据库
Spark综合练习——电影评分数据分析
Spark综合练习——电影评分数据分析
89 0
|
SQL 分布式计算 数据挖掘
大数据Spark电影评分数据分析
大数据Spark电影评分数据分析
171 0