1. 程式人生 > >通話資訊統計分析

通話資訊統計分析

 

 

 


 

 

 

資料探勘實驗報告

 

  生活中的大資料之通話記錄分析  

 

 

 

 

 

 

 

 

二〇一八年十二月

 

 

 

通話資訊統計分析

  • 專案背景

近年來,隨著手機裝置的逐漸普及,手機資料在城市規劃中的應用受到了越來越多的關注。手機資料不僅包含使用者的通話資訊,而且還包含使用者的位置資訊,可以用於分析使用者的移動軌跡和通話模式。由於手機裝置的普及,手機資料中幾乎包含了所有人的通話和位置資訊,現在手機資料還可以用於分析城市的行為特徵。這些行為特徵可以被挖掘出來,給城市規劃者和政府決策者提供更為全面的城市分析結果,從而做出更合理的城市規劃。

二、專案介紹

(一)專案需求

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;