数据挖掘实验报告
生活中的大数据之通话记录分析
二〇一八年十二月
通话信息统计分析
- 项目背景
近年来,随着手机设备的逐渐普及,手机数据在城市规划中的应用受到了越来越多的关注。手机数据不仅包含用户的通话信息,而且还包含用户的位置信息,可以用于分析用户的移动轨迹和通话模式。由于手机设备的普及,手机数据中几乎包含了所有人的通话和位置信息,现在手机数据还可以用于分析城市的行为特征。这些行为特征可以被挖掘出来,给城市规划者和政府决策者提供更为全面的城市分析结果,从而做出更合理的城市规划。
二、项目介绍
(一)项目需求
1、假设某手机号通话时长大于300则定义为好友号码或亲友电话,从数据中筛选出所有符合定义的电话号码,显示电话号码、通话时长、通话日期、电话所在地、通话类型
2、查出该通话记录中通话时长最短的,显示其通话的日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
3、统计每个手机卡的用户总量,并按大小排序4、统计通话次数最多的城市的所有电话卡的通话次数,并输出次数最多的电话卡与城市;
5、统计每个电话卡的通话次数,并按大小排序;6、查询北京市的所有通话时间
7、统计通话次数最多的城市的所有电话卡的通话次数,并输出前10个通话次数最多的电话卡
8、统计第一学期(2017-09-01~2018-01-01)的通话
9、把刚从手机里导出的数据还原至官网数据,保留日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
10、查出该通话记录中通话时长最长的前5名,显示其通话的日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
(二)项目实现(项目架构)
1、通过Flume工具将通话记录call_records表和号段信息number_field表导入到HDFS中保存;
2、通过Loader工具将MySQL中的call_records表和号段信息number_field表导入Hive中保存;
3、使用MapReduce对HDFS中的通话记录call_records表数据和号段信息number_field表数据进行清洗,清洗要求去除错误字段,补充不完整字段,并根据Hive分析需求取出所涉及字段按照一定格式保存到HDFS中。清洗之后要求保留如下字段:
日期phone_data 电话号码 phone_number 通话时长call_duration 类型type
"id"id "号段"number_bigst "区号"area "城市 "city" 手机卡类型"card_type
4、将MapReduce清洗后的数据导入Hive中,使用Hive对清洗后的数据和从MySQL中导入的数据进行统计分析。具体统计分析内容见“项目需求”;
5、将分析出的数据导出一份到MySQL数据库中,供前端程序员调用展示。并在HBase中存储一份,作为公司历史数据进行备份。
三、项目数据
本项目需要出来的数据包括通话记录call_records表和号段信息number_field表。
提前生成相应数据,放在集群外某个节点的指定目录下(节点IP地址为10.51.46.105。指定目录为/home/zhangyu/liwen);并规划相应字段作为分析目标,并生成通话记录数据和号段信息数据以维表的方式存入MySQL数据库中(数据库所在节点的IP地址为10.51.46.105,可以通过SSH方式访问,用户名为zhangyu,密码为zhangyu),生成通话记录维表和号段信息维表,并将 统计数据存入MySQL数据库中,生成相应统计数据表。
1、通话记录call_records表
2、号段信息number_field表
四、代码实现
1、假设某手机号通话时长大于300则定义为好友号码或亲友电话,从数据中筛选出所有符合定义的电话号码,显示电话号码、通话时长、通话日期、电话所在地、通话类型
insert overwrite directory "/04"
select distinct aa.phone_number,aa.call_duration,aa.phone_data,dd.city,aa.type from
(select *,substr(phone_number,0,7) as m from call_records where call_duration>1000 )aa
inner join (select *,substr(number_bigst,2,7) as n from number_field)dd
on aa.m=dd.n
where dd.city is not null;
2、查出该通话记录中通话时长最短的,显示其通话的日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
insert overwrite directory "/05"
select cc.phone_data,cc.phone_number,dd.city,cc.call_duration,cc.type from
(select *,substr(phone_number,1,7) as m from call_records order by call_duration asc limit 1)cc
left join (select *,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.city is not null;
3、统计每个手机卡的用户总量,并按大小排序
select card_type,count(number_bigst)as mm from number_field group by card_type order by mm asc;
4、统计通话次数最多的城市的所有电话卡的通话次数,并输出次数最多的电话卡与城市
select cc.phone_number,dd.city,cc.chishu,dd.card_type from
(select phone_number,count(*) as chishu,substr(phone_number,1,7) as m from call_records group by phone_number)cc
left join (select city,card_type,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.card_type is not null order by cc.chishu desc limit 1;
5、统计每个电话卡的通话次数,并按大小排序
insert overwrite directory "/06"
select dd.card_type,cc.chishu from
(select phone_number,count(*) as chishu,substr(phone_number,1,7) as m from call_records group by phone_number)cc
left join (select city,card_type,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.city is not null order by cc.chishu desc ;
6 、查询北京市的所有通话时间
insert overwrite directory "/01" select cc.phone_data from (select *,substr(phone_number,0,7)as m from call_records )cc left join (select *,substr(number_bigst,2,7)as n from number_field where city='北京市')dd on cc.m=dd.n ORDER BY cc.phone_data;
7、统计通话次数最多的城市的所有电话卡的通话次数,并输出前10个通话次数最多的电话卡
select cc.phone_number,dd.city,cc.chishu,dd.card_type from
(select phone_number,count(*) as chishu,substr(phone_number,1,7) as m from call_records group by phone_number)cc
left join (select city,card_type,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.card_type is not null order by cc.chishu desc limit 10;
8、统计第一学期(2017-09-01~2018-01-01)的通话
select cc.phone_data,cc.phone_number,dd.city from
(select phone_number,substr(phone_number,1,7) as m,phone_data from call_records )cc
left join (select city,card_type,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.city is not null and phone_data>="2017-09-01" and phone_data<"2018-01-01"
order by phone_data;
9、把刚从手机里导出的数据还原至官网数据,保留日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
select cc.phone_data,cc.phone_number,dd.city,cc.call_duration,cc.type from
(select *,substr(phone_number,0,7) as m from call_records)cc
left join (select *,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n
where dd.city is not null;//不显示空号数据(因为原始数据是用java代码写的,所以回出现空号)
10、查出该通话记录中通话时长最长的前5名,显示其通话的日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
select cc.phone_data,cc.phone_number,dd.city,cc.call_duration,cc.type from
(select *,substr(phone_number,1,7) as m from call_records order by call_duration desc limit 5)cc
left join (select *,substr(number_bigst,2,7) as n from number_field)dd
on cc.m=dd.n where dd.city is not null;
11、查出该通话记录中通话时长最短的一名,显示其通话的日期、电话号码、城市、通话时间、手机类型、(呼出呼入)类型
select cc.phone_data,cc.phone_number,dd.city,cc.call_duration,cc.type from
(select *,substr(phone_number,1,7) as m from call_records order by call_duration asc limit 5)cc
left join (select *,substr(number_bigint,2,7) as n from number_field)dd
on cc.m=dd.n where dd.city is not null;