3.3 数据分析
我们的数据已经完整的采集到了HBase集群中,这次我们需要对采集到的数据进行分析,统计出我们想要的结果。注意,在分析的过程中,我们不一定会采取一个业务指标对应一个mapreduce-job的方式,如果情景允许,我们会采取一个mapreduce分析多个业务指标的方式来进行任务。具体何时采用哪种方式,我们后续会详细探讨。
分析模块流程如图3****所示:
业务指标:
a) 用户每天主叫通话个数统计,通话时间统计。
b) 用户每月通话记录统计,通话时间统计。
c) 用户之间亲密关系统计。(通话次数与通话时间体现用户亲密关系)
3.3.1 需求分析
根据需求目标,设计出下述(3.2.2)表结构。我们需要按照时间范围(年月日),结合MapReduce统计出所属时间范围内所有手机号码的通话次数总和以及通话时长总和。
思路:
a) 维度,即某个角度,某个视角,按照时间维度来统计通话,比如我想统计2017年所有月份所有日子的通话记录,那这个维度我们大概可以表述为2017年月日
b) 通过Mapper将数据按照不同维度聚合给Reducer
c) 通过Reducer拿到按照各个维度聚合过来的数据,进行汇总,输出
d) 根据业务需求,将Reducer的输出通过Outputformat把数据
数据输入:HBase
数据输出:Mysql
HBase****中数据源结构:
表6
|
标签
|
举例&说明
|
|
rowkey
|
hashregion_call1_datetime_call2_flag_duration
01_15837312345_20170527081033_13766889900_1_0180
|
|
family
|
f1列族:存放主叫信息
f2列族:存放被叫信息
|
|
call1
|
第一个手机号码
|
|
call2
|
第二个手机号码
|
|
date_time
|
通话建立的时间,例如:20171017081520
|
|
date_time_ts
|
date_time对应的时间戳形式
|
|
duration
|
通话时长(单位:秒)
|
|
flag
|
标记call1是主叫还是被叫(call1的身份与call2的身份互斥)
|
a) 已知目标,那么需要结合目标思考已有数据是否能够支撑目标实现;
b) 根据目标数据结构,构建Mysql表结构,建表;
c) 思考代码需要涉及到哪些功能模块,建立不同功能模块对应的包结构。
d) 描述数据,一定是基于某个维度(视角)的,所以构建维度类。比如按照“年”与“手机号码”的组合作为key聚合所有的数据,便可以统计这个手机号码,这一年的相关结果。
e) 自定义OutputFormat用于对接Mysql,使数据输出。
f) 创建相关工具类。
3.3.2 Mysql表结构设计
我们将分析的结果数据保存到Mysql中,以方便Web端进行查询展示。
1) 表7****:db_telecom.tb_contacts
用于存放用户手机号码与联系人姓名。
表7 db_telecom.tb_contacts
|
列
|
备注
|
类型
|
|
id
|
自增主键
|
int(11) NOT NULL
|
|
telephone
|
手机号码
|
varchar(255) NOT NULL
|
|
name
|
联系人姓名
|
varchar(255) NOT NULL
|
2) 表8****:db_telecom.tb_call
用于存放某个时间维度下通话次数与通话时长的总和。
表8 db_telecom.tb_call
|
列
|
备注
|
类型
|
|
id_date_contact
|
复合主键(联系人维度id,时间维度id)
|
varchar(255) NOT NULL
|
|
id_date_dimension
|
时间维度id
|
int(11) NOT NULL
|
|
id_contact
|
查询人的电话号码
|
int(11) NOT NULL
|
|
call_sum
|
通话次数总和
|
int(11) NOT NULL DEFAULT 0
|
|
call_duration_sum
|
通话时长总和
|
int(11) NOT NULL DEFAULT 0
|
3) 表9****:db_telecom.tb_dimension_date
用于存放时间维度的相关数据
表9 db_telecom.tb_dimension_date
|
列
|
备注
|
类型
|
|
id
|
自增主键
|
int(11) NOT NULL
|
|
year
|
年,当前通话信息所在年
|
int(11) NOT NULL
|
|
month
|
月,当前通话信息所在月,如果按照年来统计信息,则month为-1。
|
int(11) NOT NULL
|
|
day
|
日,当前通话信息所在日,如果是按照月来统计信息,则day为-1。
|
int(11) NOT NULL
|
4) 表10****:db_telecom.tb_****intimacy
用于存放所有用户用户关系的结果数据。(作业中使用)
表10 db_telecom.tb_intimacy
|
列
|
备注
|
类型
|
|
id
|
自增主键
|
int(11) NOT NULL
|
|
intimacy_rank
|
好友亲密度排名
|
int(11) NOT NULL
|
|
id_contact1
|
联系人1,当前所查询人
|
int(11) NOT NULL
|
|
id_contact2
|
联系人2,与联系人为好友
|
int(11) NOT NULL
|
|
call_count
|
两联系人通话次数
|
int(11) NOT NULL DEFAULT 0
|
|
call_duration_count
|
两联系人通话持续时间
|
int(11) NOT NULL DEFAULT 0
|
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。
网友评论