开发者社区> 白头雁> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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示例。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
数据访问函数库的使用方法(二)—— 获取记录集和使用事务的方法
使用SQL语句来获取记录集的方法 string sql = "select col1,col2,col3  from TableName where ";            //获取DataTable            DataTable dt = dal.
506 0
差异分析②
样品的无监督聚类 检查基因表达分析最重要的探索性策略之一是多维定标(MDS)图或类似的图。该图以无监督的方式显示了样本之间的相似性和不相似性,以便人们可以了解在进行正式测试之前可以检测差异表达的程度。
731 0
数据分析
数据分析 提供了数据集合, 应该将他们分成两类, 一个是测试类, 一个是训练类 深度学习中最难的就是特征提取 并不是数据中的所有特征都有用的, 没有需要的使用DataFrame中的drop()去掉 one-hot: 将string值转为int值,方便运算 --> pd.
511 0
数据分析模型-关联模型
尿布与啤酒背后的原理,如何让客户加满购物篮?
0 0
超市营业额数据分析
超市营业额数据分析
0 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
基于Spark的大规模机器学习在微博的应用
立即下载
CarbonData:大数据交互式分析实践
立即下载
《实时数据分析演示)》
立即下载