SparkSQL 电影评价数据分析
当我做了很多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>对象
- spark.read().textFile 生成Dataset<String>对象
- javaRDD() 生成JavaRDD<String>对象
- map(String->{}) 生成JavaRDD<Object>对象
- 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示例。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
车联网上云最佳实践(二)
云上对标架构及技术详解我们对传统IDC应用架构进行分析之后,我们发现之前的系统架构存在一些不合理的地方导致了很多的痛点,为了解决这些痛点我们最终考虑上云。开始思考怎样利用云上产品来解决目前遇到的痛点。例如 为了解决我们自建IDC底层基础设施可靠性差的问题,我们改用云计算服务,基础设施可靠性,异地容灾,数据备份,数据安全等问题再也不用担心; 为了解决存储性能瓶颈以及用户访问体验问题,我们改用云上对象存储OSS服务+CDN; 为了解决单台数据库性能扩展瓶颈,我们改用云上的DRDS分布式关系数据库; 为了解决大规模的车机上报而导致数据写入延迟问题我们改用云上IOT套件+HiTSDB; 为了解决日常以及节假日流量高峰的问题,我们改用云上弹性伸缩服务+按量付费,以最低的成本完美解决日常及节假日流量高峰
- 下一篇
中国HBase技术社区第三届MeetUp —HBase应用实践专场(杭州阿里西溪园区)
HBase—Hadoop Database是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。HBase的特点是高可靠性、高性能、面向列、可伸缩的分布式存储系统,如今HBase已经广泛应用于各互联网行业。那么我们如何熟练掌握HBase技术并落地应用呢? 2018年9月1号,由中国HBase技术社区、阿里云、DataFun社区主办的中国HBase技术社区 Meetup将来到杭州,届时来自阿里云、网易、挖财等公司的HBase技术专家们,将为大家分享HBase的应用实践。 主办方:中国HBase技术社区、阿里云、DataFun社区视频支持:IT大咖说时间:2018.09.01,13:00-18:00 地点:杭州市余杭区文一西路969号阿里巴巴西溪园
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS关闭SELinux安全模块