通話資訊統計分析
資料探勘實驗報告
生活中的大資料之通話記錄分析
二〇一八年十二月
通話資訊統計分析
- 專案背景
近年來,隨著手機裝置的逐漸普及,手機資料在城市規劃中的應用受到了越來越多的關注。手機資料不僅包含使用者的通話資訊,而且還包含使用者的位置資訊,可以用於分析使用者的移動軌跡和通話模式。由於手機裝置的普及,手機資料中幾乎包含了所有人的通話和位置資訊,現在手機資料還可以用於分析城市的行為特徵。這些行為特徵可以被挖掘出來,給城市規劃者和政府決策者提供更為全面的城市分析結果,從而做出更合理的城市規劃。
二、專案介紹
(一)專案需求
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;