
12.1 通过RDD实现分析电影的用户行为信息
在本节中,我们首先搭建IDEA的开发环境。电影点评系统基于IDEA开发环境进行开发,本节对大数据电影点评系统中电影数据格式和来源进行了说明,然后通过RDD方式实现分析电影的用户行为信息的功能。
12.1.1 搭建IDEA开发环境
1.IntelliJ IDEA环境的安装
如图12-1所示,登录IDEA的官网,打开http://www.jetbrains.com/idea/网站,单击DOWNLOAD进行IDEA的下载。IDEA全称IntelliJ IDEA,是Java语言开发的集成环境,具备智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查等方面的功能,支持Maven、Gradle和STS,集成Git、SVN、Mercurial等,在Spark开发程序时通常使用IDEA。单击DOWNLOAD下载,下载安装包以后根据IDEA安装提示一步步完成安装。

图12-1 IDEA的官网
IDEA在本地计算机上安装完成以后,打开IDEA的默认显示主题风格是Dracula的主题格式,也是众多IDEA开发者喜欢的格式。但为了便于读者阅读,这里将IDEA的显示主题风格调整为IntelliJ格式,单击File→Settings→Appearance→Theme→IntelliJ,这样书本纸质显示更清晰,如图12-2所示。

图12-2 修改IDEA显示主题格式
IDEA安装完成,在Windows系统中完成Windows JDK的安装与配置。安装和配置完成以后,测试验证JDK能否在设备上运行。选择“开始”→“运行”命令,在运行窗口中输入CMD命令,进入DOS环境,在命令行提示符中直接输入java -version,按回车键,系统会显示JDK的版本,说明JDK已经安装成功,代码如下:

2.新建Maven工程(SparkApps工程),导入Spark 2.0相关JAR包及源码
(1)在IDEA菜单栏中新建工程,单击File→Project,如图12-3所示。

图12-3 新建工程
(2)在弹出的New Project对话框中选择Maven方式,单击Next按钮,如图12-4所示。

图12-4 选择Maven方式
(3)在弹出的对话框中输入GroupId及ArtifactId,如图12-5所示。

图12-5 输入GroupId及ArtifactId
(4)在弹出的对话框中输入工程名及工程保存位置,单击Finish按钮完成,如图12-6所示。

图12-6 输入工程名及工程保存位置
(5)在SparkApps工程中设置Maven配置参数。单击File→Settings→Build,Execution,Deployment→Maven→User settings file及Local repository,输入用户配置文件及本地库保存地址,如图12-7所示。

图12-7 输入用户配置文件及本地库保存地址
其中,setting.xml代码完整的配置内容如例12-1所示。
【例12-1】setting.xml文件内容。

(6)在SparkApps工程中单击pom.xml,编辑pom.xml文件,如图12-8所示。

图12-8 编辑pom文件
pom代表“项目对象模型”。这是一个文件名为pom.xml的Maven项目的XML表示形式。在Maven系统中,一个项目除了代码文件外,还包含配置文件,包括开发者需要遵循的规则、缺陷管理系统、组织和许可证、项目的url、项目的依赖,以及其他所有的项目相关因素。在Maven系统中,项目不需要包含代码,只是一个pom.xml。pom.xml包括了所有的项目信息。
本书的案例基于Maven方式进行开发,项目中依赖的JAR包都从pom.xml中下载获取,这里提供了一份完整的pom.xml文件,读者可以根据pom.xml文件搭建开发环境,测试运行本书稿的各综合案例。
pom.xml代码完整的配置内容如例12-2所示。
【例12-2】pom.xml文件内容。








(7)在pom.xml中,按Ctrl+S快捷键保存pom.xml文件,IDEA会自动从网上下载各类Jar包,下载的时间根据网络带宽的情况可能需要几十分钟,也可能需要几个小时,全部下载好以后,可以看到工程中External Libraries已经加载了Spark相关的Jar包及源码,如图12-9所示。

图12-9 使用Maven方式加载Jar包
3.在SparkApps工程中建立scala目录
单击SparkApps工程下的src/main目录,右击main,从弹出的快捷菜单中选择New→Directory命令,新建一个目录scala,如图12-10所示。

图12-10 新建目录
单击SparkApps工程下的src/main/scala目录,右击scala,从弹出的快捷菜单中选择Mark Directory as→Resource Root命令,标识目录scala为源码目录。至此,IDEA本地开发环境搭建完成,如图12-11所示。

图12-11 设置为代码目录
12.1.2 大数据电影点评系统中电影数据说明
1.大数据电影点评系统电影数据的来源
电影推荐系统(MovieLens)是美国明尼苏达大学(Minnesota)计算机科学与工程学院的GroupLens项目组创办的,是一个非商业性质的、以研究为目的的实验性站点。电影推荐系统主要使用协同过滤和关联规则相结合的技术,向用户推荐他们感兴趣的电影。这个项目是由John Riedl教授和Joseph Konstan教授领导的。该项目从1992年开始研究自动化协同过滤,在1996年使用自动化协同过滤系统应用于USENET新闻组中。自那以后,项目组扩大了研究范围,基于内容方法以及改进当前的协作过滤技术来研究所有的信息过滤解决方案。
电影推荐系统(MovieLens)的数据下载地址为: https://grouplens.org/datasets/movielens/。GroupLens项目研究收集了从电影推荐系统MovieLens站点提供评级的数据集(http://MovieLens.org),收集了不同时间段的数据,我们可以根据电影分析业务需求下载不同规模大小的数据源文件。
2.大数据电影点评系统电影数据的格式说明
这里下载的是中等规模的电影推荐系统数据集。在本地目录moviedata/medium包含的电影点评系统数据源中提供了在2000年6040个用户观看约3900部电影发表的1 000 209条匿名评级数据信息。
评级文件ratings.dat的格式描述如下:

评级文件ratings.dat中摘取部分记录如下:

用户文件users.dat的格式描述如下:

从用户文件users.dat中摘取部分记录如下:

电影文件movies.dat的格式描述如下:

电影文件movies.dat中摘取的部分记录如下:

职业文件occupations.dat的格式描述如下:

从职业文件occupations.dat中摘取部分记录如下:

12.1.3 电影点评系统用户行为分析统计实战
在本节大数据电影点评系统用户行为分析统计实战中,我们需统计用户观看电影和点评电影行为数据的采集、过滤、处理和展示。对于用户行为的数据采集:在生产环境中,企业通常使用Kafka的方式实时收集前端服务器中发送的用户行为日志记录信息;对于用户行为的数据过滤:可以在前端服务器端进行用户行为数据的过滤和格式化,也可以采用Spark SQL的方式进行数据过滤。在大数据电影点评系统用户行为分析统计实战中,基于GroupLens项目组电影推荐系统(MovieLens)已经采集的用户电影观看和点评数据文件,我们直接基于ratings.dat、users.dat、movies.dat、occupations.dat文件进行用户行为实战分析。
用户行为分析统计的数据处理:①一个基本的技巧是,先使用传统的SQL去实现一个数据处理的业务逻辑(自己可以手动模拟一些数据);②在Spark2.x的时候,再一次推荐使用DataSet去实现业务功能,尤其是统计分析功能;③如果想成为专家级别的顶级Spark人才,请使用RDD实现业务功能,为什么?原因很简单,因为使用Spark DataSet方式有一个底层的引擎catalyst,基于DataSet的编程,catalyst的引擎会对我们的代码进行优化,有很多优化的言外之意是你看不到问题到底是怎么来的,假设出错了,优化后的RDD跑在Spark上,打印的错误不是直接基于DataSet产生的错误,DataSet是在内核上的封装,运行的时候是基于RDD的!因此,打印的错误是基于RDD的。DataSet的优化引擎catalyst涉及Spark底层的代码封装。在DataSet的解析过程中,基于抽象语法树和语法规则的相互配合,引擎catalyst完成了词法分析、未解析的逻辑计划、解析以后的逻辑计划、优化后的逻辑计划、物理计划、可执行的物理计划、物理计划执行、生成RDD等一系列过程。如果使用DataSet出现问题,我们可能不知其所以然。而在业务代码编码中,如果我们直接使用RDD,可以直接基于RDD来排查问题。在本节大数据电影点评系统用户行为分析统计实战中,我们通过RDD的方式直接统计分析用户的电影行为。
用户行为分析统计的数据格式:在生产环境中,强烈建议大家使用Parquet的文件格式。Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月成为Apache顶级项目。Parquet是列式存储格式的一种文件类型,可以适配多种计算框架,是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件。在本节大数据电影点评系统用户行为分析统计实战中,我们研究试验中小规模的用户电影点评数据的分析,专注于大数据Spark RDD的算子实现,这里仍使用GroupLens项目组提供的文本文件格式,不进行Parquet格式的转换。
大数据电影点评系统用户行为分析统计的数据源格式如下:

大数据电影点评系统用户行为分析统计实战,我们使用Spark本地模式进行开发,在IDEA开发环境的SparkApps工程中的src/main/scala目录中新建包com.dt.spark.cores,然后在com.dt.spark.cores下新建Movie_Users_Analyzer_RDD.scala文件。
在Movie_Users_Analyzer_RDD.scala文件中导入电影点评数据。

电影点评系统用户行为分析之一,统计具体某部电影观看的用户信息,如电影ID为1193的用户信息(用户的ID、Age、Gender、Occupation)。为了便于阅读,我们在Spark Driver端collect()获取到RDD的元素集合以后,使用collect().take(2)算子打印输出RDD的两个元素,最后的用户信息的输出结果,我们使用collect().take(20)显示10个元素。

在IDEA中运行代码,结果如下:
