MRjob项目实战(观影日志分析)

BUG之神 135

mrjob 多种运行方式
1、local 本地测试,直接在本地运行代码,检测代码是否有 bug;
2、inline 内嵌模式,在本地模拟 hadoop 集群上运行,特点是调试方便,启动单一进程模拟任务执行状态及结果,Mrjob 默认以内嵌方式运行
3、hadoop 集群模式,在 hadoop 集群上运行;
4、emr Amazon EMR 模式,参照 aws;
5、dataproc Google Cloud Platform 模式,参照谷歌云平台 Google Cloud Platform。


实战一:

这是一份用户观影的日志,日志是经过处理的 json 文件

数据文件:

video.log:http://bug.xuexianswer.com/hadoop/mrjob_data/video.log

下载数据文件:

wget -c http://bug.xuexianswer.com/hadoop/mrjob_data/video.log -O video.log

实验目标:通过这份日志来统计每部电影的热度,即每部电影有多少人观看过

{"user_id": "5E79247F1098C82E436B5980AF98D67D", "action": 0, "timestamp": 1534551357, "data": "01"}
{"user_id": "45f218b28d19492a94c2fb1853351b91", "action": 0, "timestamp": 1535673718, "data": "04"}
{"user_id": "5E79247F1098C82E436B5980AF98D67D", "action": 0, "timestamp": 1535750303, "data": "10"}

日志参数含义:

1、user_id:用户 id,观影用户的唯一标识;
2、action:用户行为,0表示用户浏览电影信息,并未进行观看,1表示用户观看了电影;
3、timestamp:时间戳,表示用户行为的发生时间;
4、data:电影 id,被操作的电影 id。

实战前准备:安装MRjob以及matplotlib

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ pyyaml
pip install mrjob
pip install matplotlib

实现思路

1.下载数据文件video.log,放于项目目录中

2.创建video.py,通过 mapper 将输入的每条日志转为电影id:1格式的key:value值。然后在通过 reducer 针对每个 key(电影)进行 sum 的求和操作。最后就能统计出每部电影的观看用户数量。

from mrjob.job import MRJob
import json
#统计每个电影有多少人观看过
class GetVideos(MRJob):
    def mapper(self, _, line):
        try:
            jsline = json.loads(line)
            cuid = jsline["user_id"]
            action = jsline["action"]
            video = jsline["data"]
            if action == 1:
                yield video,1
        except Exception:
            pass
    def reducer(self, key, value):
        yield key,sum(value)
if __name__ == '__main__':
    GetVideos.run()

3.执行video.py文件

python video.py -r inline video.log > result.txt

4.运行结束后,result.txt文件内容为:

"01"	1
"02"	2
"03"	1
"04"	2
"05"	1
"06"	3
"07"	2
"09"	1
"10"	1
"11"	1
"12"	3
"14"	3
"15"	2

5.序号与对应的电影名称关系,如下:

01      一出好戏
02      大三儿
03      精灵旅社3:疯狂假期
04      巨齿鲨
05      欧洲攻略
06      快把我哥带走
07      新乌龙院之笑闹江湖
08      西虹市首富
09      小偷家族
10      爱情公寓
11      美食大冒险之英雄烩
12      狄仁杰之四大天王
13      神秘世界历险记4
14      最后的棒棒
15      风雨咒

6.编写result.py文件,将result.py的内容用图表的形式呈现:

import matplotlib.pyplot as plt
#下方两行代码用于防止绘图时出现中文乱码
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

# 创建空列表,用于将电影,观影人数分别存放到x,y数组中
x = []
y = []

for line in open("result.txt"):#逐行读取
    #将电影序号替换为电影名称
    replist = {"01": "一出好戏",
               "02": "大三儿",
               "03": "精灵旅社",
               "04":"巨齿鲨",
               "05": "欧洲攻略",
               "06": "快把我哥带走",
               "07": "新乌龙院",
               "08": "西虹市首富",
               "09": "小偷家族",
               "10": "爱情公寓",
               "11": "美食大冒险",
               "12": "狄仁杰",
               "13": "神秘世界",
               "14": "最后的棒棒",
               "15": "风雨咒",
               }
    for i in replist:
        line = line.replace(i, replist[i])

    # print(line)
    # 按空格分割为数组
    wordsArray = line.split()
    x.append(wordsArray[0])#将电影名添加到数组x中
    y.append(wordsArray[1])#将观影人数添加到数组y中
#绘制柱形图
plt.title('观影人数统计')
# 防止标签重叠,可以将窗口设置的大一些
# plt.figure(figsize=(20, 6.5))
plt.bar(x, y, color = 'g', width = 0.5)
plt.show()

7.最终的观影效果展示图:

MRjob项目实战(观影日志分析)


 

 

 

分享