码迷,mamicode.com
首页 > 其他好文 > 详细

【spark】示例:连接操作

时间:2018-05-15 00:23:21      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:生成   value   不用   额外   示例   个数   要求   连接   集合   

我们有这样两个文件

技术分享图片技术分享图片

任务:找出用户评分平均值大于4的电影。

我们看两个文件结果,第一个文件有电影的ID和名字,第二个文件有电影的ID和所有用户的评分

对于任务结果所需要的数据为电影ID,电影名字,平均评分。平均评分用所有用户评分总和/用户数来求出

1.我们先计算电影的评分

 (1)先读取电影评分文件

技术分享图片

(2)取数据

我们看到每行的数据是通过::来进行连接的,然后我们需要的是第二列的电影ID以及第二列的评分。

我们把两个有用的数据取出来,组成键值对的形式。

为什么要组成键值对的形式?

数据中每个用户的对电影的评分都是分开的,所以我们需要对电影ID进行分组操作,把所有评分分组。

之前示例中我们知道groupByKey能进行分组,同时还能把所有相同Key的数据组合成一个集合。

当我们把所有数据集合之后就很容易操作计算了。

所以我们把数据组合成为<电影ID,评分>这样的键值对的形式。

技术分享图片

3.分组计算平均评分

技术分享图片

我们看到我们分组之后,所有相同电影的不同用户的评分都被收集到了一个集合中。

那么如何计算平均评分呢?评分总分 / 评分个数 = 平均评分

Scala集合提供了sum方法来可以计算集合总和,提供了size方法来计算数据条数。

正好不用我们额外去求了,如果集合没有定义方法,我们也可以遍历后计算得出要求的值。

技术分享图片

2.在取电影ID和电影名

技术分享图片

我们查看数据结构,数据是通过::连接的,对我们有用的数据为第一列电影ID和第二列电影名称

技术分享图片

3.通过电影ID连接

我们把我们所有需要的数据都取出来了,接下来进行连接就可以了。

但是,我们连接需要把电影ID作为连接的key。

我们需要的结果为(ID,NAME,SCORE)

如果我们直接对id进行连接的话,我们连接出来的结果只有(NAME,SCORE)缺少了ID

所以我们需要再次对数据进行处理,我们通过.keyBy()方法新生成一个key,同时value为原始的数据

技术分享图片

技术分享图片

然后我们再进行连接操作,注意join连接操作是内链接,

连接后的key是连接键,value为所有相同key的集合,可以通过 _2._x 来进行访问

技术分享图片

4.过滤求出平均评分大于4的记录

技术分享图片

 

【spark】示例:连接操作

标签:生成   value   不用   额外   示例   个数   要求   连接   集合   

原文地址:https://www.cnblogs.com/zzhangyuhang/p/9038689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!