通话信息统计分析

 

 


 

 

 

数据挖掘实验报告

 

  生活中的大数据之通话记录分析  

 

 

 

 

 

 

 

 

二〇一八年十二月

 

 

通话信息统计分析

  • 项目背景

近年来,随着手机设备的逐渐普及,手机数据在城市规划中的应用受到了越来越多的关注。手机数据不仅包含用户的通话信息,而且还包含用户的位置信息,可以用于分析用户的移动轨迹和通话模式。由于手机设备的普及,手机数据中几乎包含了所有人的通话和位置信息,现在手机数据还可以用于分析城市的行为特征。这些行为特征可以被挖掘出来,给城市规划者和政府决策者提供更为全面的城市分析结果,从而做出更合理的城市规划。

二、项目介绍

(一)项目需求

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;

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40301016/article/details/85459287