项目3:统计电影网站用户影评数据
一、项目背景与目标
1.1 背景
- 时代背景:在大数据时代,发展数字经济与实体经济深度融合是构筑国际竞争力数字产业集群的关键
- 核心理念:保护用户隐私为首位,深入探索大数据价值,转化为决策资源
- 业务价值:电影评分次数直观反映影片受欢迎程度,高频次代表广泛关注和高度兴趣
1.2 项目目标
- 统计所有电影的评分次数
- 分析不同性别用户对电影的评分差异
- 为个性化推荐提供数据支持
1.3 技术选型
选用MapReduce编程框架,原因:
- 保证高处理效率
- 提供良好的灵活性
- 适合大规模数据并行处理
二、开发环境搭建
2.1 Windows下Java环境配置
安装步骤:
- 双击JDK安装包(jdk-8u281-windows-x64.exe)
- 自定义JDK和JRE安装目录(建议在同一目录下)
- 配置环境变量:
- JAVA_HOME:JDK安装目录
- Path:添加
%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin - ClassPath:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
- 验证:cmd中执行
java -version

2.2 IntelliJ IDEA安装
- 下载Community版(ideaIC-2023.2.2.exe)
- 自定义安装目录
- 配置选项:
- 创建桌面快捷方式
- 添加环境变量到系统PATH
- 选择开始菜单文件夹(默认JetBrains)
- 首次启动设置:
- 不导入以前的设定
- 选择界面主题(建议Light with Light Header以提高代码可读性)
2.3 创建MapReduce工程
- 选择Maven Archetype项目类型
- 配置项目参数:
- Name:项目名称
- JDK:版本1.8
- Archetype:maven-archetype-quickstart
- 高级设置:
- GroupId:项目组织标识符(对应Java包结构)
- ArtifactId:项目唯一标识符(对应项目名称)
- Version:1.0-SNAPSHOT(开发中版本)
2.4 配置MapReduce环境
- 打开Project Structure(Ctrl+Alt+Shift+S)
- 进入Libraries或Modules选项
- 添加Hadoop的Jar包:
- 导入Hadoop安装包/share/hadoop目录下的全部Jar包
- 注意:需提前在本地解压Hadoop安装包
- 点击Apply和OK完成配置
2.5 添加集群配置文件
- core-site.xml:核心配置文件
- hdfs-site.xml:HDFS配置文件

三、MapReduce编程基础
3.1 核心组件
MapReduce程序三大模块:
(1) Driver模块(应用程序入口)
- 初始化Hadoop配置
- 创建Job对象并设置主类
- 设置Mapper、Combiner、Reducer
- 设置输出键值对格式
- 设置输入输出路径
- 提交任务并等待运行
(2) Mapper模块(Map阶段)
- 自定义类继承Mapper类
- 覆写map()方法
- 实现具体业务逻辑
- 输出中间键值对
(3) Reducer模块(Reduce阶段)
- 自定义类继承Reducer类
- 覆写reduce()方法
- 处理Mapper输出的键值对
- 输出最终结果
3.2 词频统计示例(WordCount)
输入数据:
Hello World Our World
Hello BigData Real BigData
Hello Hadoop Great Hadoop
Hadoop MapReduce输出结果:
BigData 2
Great 1
Hadoop 3
Hello 3
MapReduce 1
Our 1
Real 1
World 2执行流程:
- Map阶段:
- 读取输入文件每一行
- 按单词分割,输出键值对
<单词, 1> - 例如:
<Hello, 1>,<World, 1>
- Shuffle/Sort过程:
- 对Map输出的键值对按键排序
- 将键相同的值聚合到列表中
- 例如:
<Hello, [1,1,1]>
- Reduce阶段:
- 读取聚合后的键值对
- 累加同一键的所有值
- 输出最终统计结果
<单词, 总次数>
四、用户登录次数排序案例
4.1 问题描述
- 项目2已实现用户登录次数统计
- 结果按用户邮件地址升序排序
- 无法直观查看登录次数分布情况
4.2 解决方案
按登录次数进行升序排序
4.3 实现逻辑
Mapper模块:
1. 继承Mapper类,覆写map()方法
2. 读取用户访问日志文件
3. 使用制表符"\t"作为分隔符
4. 交换键值位置:将<邮箱, 次数>转为<次数, 邮箱>
5. 输出中间结果Reducer模块:
1. 继承Reducer类,覆写reduce()方法
2. 读取Mapper输出的键值对
3. 再次交换键值位置:将<次数, 邮箱>还原为<邮箱, 次数>
4. 输出最终结果<邮件地址, 登录次数>核心思想:利用MapReduce默认按键排序的特性,通过键值交换实现按次数排序
五、电影评分数据统计项目实践
5.1 数据文件说明(需要可私)
- movies.dat:电影信息(电影ID、电影名称、类型)
- ratings.dat:评分信息(用户ID、电影ID、评分、时间戳)
- users.dat:用户信息(用户ID、性别、年龄等)
5.2 任务一:统计所有电影的评分次数
目标输出:
- 电影ID(MovieID)
- 电影类型(MovieType)
- 评分次数(RateNum)
实现步骤:
- 表连接(MoviesJoinRatings):
- 连接movies.dat和ratings.dat
- 处理方式:
- ReduceJoin:适合数据量相当的情况
- MapJoin:一张表较小时使用,避免数据倾斜
- 统计评分次数(MoviesRatesAll):
- 按电影ID分组
- 统计每部电影的评分次数
- 输出电影信息和评分次数
技术要点:
- 数据倾斜处理:合理选择Join方式
- MapJoin优化:将小表加载到内存,提高性能
5.3 任务二:统计不同性别用户对电影的评分
目标输出:
- 电影ID(MovieID)
- 性别(Gender)
- 平均评分(avgRat)
实现步骤:
- 三表连接(MapjoinThreeTables):
- 连接movies.dat、users.dat、ratings.dat
- 使用MapJoin方式:
- 将movies.dat和users.dat作为小表加载到内存
- ratings.dat作为主表进行扫描
- 关联字段:MovieID、UserID
- 分组计算平均评分(MoviesRatesAllGroupByGender):
- 按性别(Gender)和电影ID(MovieID)分组
- 计算每个分组的平均评分
- 输出:<电影ID, 性别, 平均评分>
业务价值:
- 分析男性和女性观众的观影偏好差异
- 为个性化推荐系统提供数据支持
- 针对不同性别用户推荐相关电影
六、项目总结
6.1 技术掌握
- 环境搭建:
- Windows下Java和IntelliJ IDEA的安装配置
- MapReduce工程创建和环境配置
- 编程基础:
- MapReduce工作原理和执行流程
- 通过WordCount源码理解编程模式
- Driver、Mapper、Reducer三大模块的实现
- 实战技能:
- 用户登录次数排序的实现逻辑
- 表连接操作(ReduceJoin vs MapJoin)
- 数据倾斜问题的处理
- 多表关联和分组统计
6.2 业务价值
- 统计电影评分次数,衡量影片受欢迎程度
- 分析性别差异,支持个性化推荐
- 为电影平台运营决策提供数据支持
6.3 关键技术点
- 数据处理:大规模数据的并行处理
- 性能优化:MapJoin避免数据倾斜
- 数据安全:保护用户隐私为首位
- 扩展性:MapReduce框架的高扩展性
6.4 项目意义
在大数据时代背景下,本项目展示了如何利用MapReduce框架高效处理海量电影评分数据,既保证了处理效率,又为业务决策提供了有价值的数据洞察,体现了数据驱动决策的实际应用价值。
项目完成标志:
✅ 开发环境搭建完成 ✅ MapReduce编程基础掌握 ✅ 电影评分次数统计实现 ✅ 性别差异分析完成 ✅ 结果存储至HDFS