電信手機流量數據分析

實驗環境

  • Chrome 瀏覽器 (能使用開發者模式的瀏覽器都行)
  • 任意可編輯Python代碼的編輯器
  • Python3 開發環境

一 源數據分析

1、數據說明

1、本次案例使用的數據是互聯網終端訪問各大服務所產生的日誌,日誌內容如下圖所示。
在這裏插入圖片描述

從圖中可以看出每行出局的列數都是不相等的,且每一列的數據也不相同,我們要對這些數據進行分析很困難,所以需要將這些元數據進行清洗和過濾,過濾出符合統計要求的數據,過濾後的數據如下圖所示。

在這裏插入圖片描述
字段說明如下

字段 說明
BeginTime 採集第一個數據包的時間
EndTime 採集最後一個數據包的時間
MSISDN 用戶的手機號碼
SourceIP 用戶的IP地址
SourcePort 用戶的端口號
APMAC AP mac
APIP AP IP
DestinationIP 用戶訪問的業務平臺的IP地址
DestinationPort 訪問的目標端口號
Service 詳細的業務類型
ServiceType1 業務組類型
ServiceType2 業務組類型2
UpPackNum 上行數據包數
DownPackNum 下行數據包數
UpPayLoad 上行總流量
DownPayLoad 下行總流量
HttpStatus HTTP Response的狀態
ClientType 1:瀏覽器;2:客戶端
ResponseTime 第一個包迴應時間

二、實現步驟

第一步: 資源準備

1、準備數據

在/usr/local目錄下創建名爲"ptyhon"的文件夾,並將源數據(ncmdp.txt)上傳到該目錄中。

2、上傳數據

在HDFS中創建"/acelog/input"目錄並將"ncmdp.txt"(元數據文件)上傳到HDFS中,命令如下。

[root@master ~]# hadoop fs -mkdir -p /acelog/input
[root@master ~]# cd /usr/local/python/
[root@master python]# hadoop fs -put ./ncmdp.txt /acelog/input
[root@master python]# hadoop fs -ls /acelog/input  

結果如下圖所示。
在這裏插入圖片描述

第二步:數據清洗

1、準備工具包

將執行代碼需要的hadoop-streaming2.7.7工具包拷貝到,/usr/local/python目錄中,代碼入下。

[root@master ~]# cp /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.7.jar /usr/local/python
[root@master ~]# cd /usr/local/python
[root@master ~]# ll

結果如下圖所示。
在這裏插入圖片描述

2、編寫Map代碼

編寫用於對數據進行清洗過濾的map代碼,通過正則表達式匹配源數據中的數據,將不符合規則的數據全部過濾,並將符合規則的數據按照每行使用"\t"作爲分割符輸出,代碼如下。

[root@master python]# vi Map.py     #代碼如下
#!/usr/bin/env python
#導入Python所需庫
import sys
import re
import time
import datetime
#循環取出每行數據
for line in sys.stdin:
    try:
#定義正則表達式分析數據
        reg = re.compile('([0-9]{1,13}) ([0-9]{1,13}) ([0-9]{7,11}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ([0-9]{4,5}) ([0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}:(CMCC-EDU|CMCC)) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ([0-9]{2}) ([\u4e00-\u9fa5]{2,10}) ([\u4e00-\u9fa5]{2,10}) ([\u4e00-\u9fa5]{2,10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) ([0-9]{1,4}) ([0-9]{1,4}) ([0-9]{1,4}) ([0-9]{1,4}) ([0-9]{1,4}) ([0-9]{1,4}) ([0-9]{1,4})')
    #使用正則表達式解析每行數據
        regMatch = reg.match(line)
    #定義輸出項
        ltime = time.localtime(int(regMatch.group(1))/1000)
        BeginTime = time.strftime("%y%m%d",ltime)
        EndTime = regMatch.group(2)
        MSISDN = regMatch.group(3)
        SourceIP = regMatch.group(4)
        SourcePort = regMatch.group(5)
        APMAC = regMatch.group(6)
        APIP = regMatch.group(8)
        DestinationIP = regMatch.group(9)
        DestinationPort = regMatch.group(10)
        Service = regMatch.group(11)
        ServiceType1 = regMatch.group(12)
        ServiceType2 = regMatch.group(13)
        UpPackNum = regMatch.group(16)
        DownPackNum = regMatch.group(17)
        UpPayLoad = regMatch.group(18)
        DownPayLoad = regMatch.group(19)
        HttpStatus = regMatch.group(20)
        ClientType = regMatch.group(21)
        ResponseTime = regMatch.group(22)
    #定義輸出格式
        print('%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s' % (BeginTime,EndTime,MSISDN,SourceIP,SourcePort,APMAC,APIP,DestinationIP,DestinationPort,Service,ServiceType1,ServiceType2,UpPackNum,DownPackNum,UpPayLoad,DownPayLoad,HttpStatus,ClientType,ResponseTime))
    except Exception  as e:
        pass

3、編寫Reduce代碼

編寫Reduce代碼將通過Map清洗後的數據合併輸出到HDFS中,命令如下。

[root@master python]# vi Reduce.py     #代碼如下
#!/usr/bin/env python
import sys
for line in sys.stdin:
    line = line.strip()
    if line !=' ':
        print (line)

代碼執行

執行MapReduce對源數據進行清洗,命令如下所示。

[root@master python]# hadoop jar /usr/local/python/hadoop-streaming-2.7.7.jar -file /usr/local/python/Map.py -mapper Map.py -file /usr/local/python/Reduce.py -reducer Reduce.py -input /acelog/input/ncmdp.txt -output /acelog/output
[root@master python]# hadoop fs -cat /output/part-00000

結果如下圖所示。
在這裏插入圖片描述

第三步:數據分析

1、清洗結果數據到HIve

將通過mapreduce系統後的數據加載到hive表中,方便使用hive對數據進行統計,代碼如下。

hive> CREATE EXTERNAL TABLE phone_db(BeginTime string,EndTime string,MSISDN string,SourceIP string,SourcePort string,APMAC string,APIP string,DestinationIP string,DestinationPort string,Service string,ServiceType1 string,ServiceType2 string,UpPackNum string,DownPackNum string,UpPayLoad string,DownPayLoad string,HttpStatus string,ClientType string,ResponseTime string) PARTITIONED BY (logdate string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/acelog/output';       #創建表
hive> ALTER TABLE phone_db ADD PARTITION(logdate='2018_05_01') LOCATION '/acelog/output/';
hive> select * from phone_db;

結果如下圖所示。
在這裏插入圖片描述

2、統計個業務類型訪問量

使用業務分類作爲分組條件,統計出不同業務類的瀏覽量,代碼如下所示。

hive> CREATE TABLE phone_db_Serviceno_2018_05_01 AS SELECT Service,COUNT(*) AS Serviceno FROM phone_db WHERE logdate='2018_05_01' group by Service;
hive> select * from phone_db_Serviceno_2018_05_01;

結果如下圖所示。
在這裏插入圖片描述

3、統計各業務組瀏覽量

統計個業務組的瀏覽,此時根據業務組進行分組統計出,不同業務組的瀏覽量,代碼如下所示。

hive> CREATE TABLE phone_db_ServiceType1no_2018_05_01 AS SELECT ServiceType1,COUNT(*) AS ServiceType1no FROM phone_db WHERE logdate='2018_05_01' group by ServiceType1;
hive> select * from phone_db_ServiceType1no_2018_05_01;

結果如下圖所示。
在這裏插入圖片描述

4、分別統計總上行和總下行流量

統計階段階段時間內的所有服務的總流量,代碼如下,

hive> CREATE TABLE phone_db_UpPayLoad_2018_05_01 AS SELECT sum(UpPayLoad) AS UpPayLoadno FROM phone_db WHERE logdate='2018_05_01' ;                 #統計總上行流量
hive> CREATE TABLE phone_db_DownPayLoad_2018_05_01 AS SELECT sum(DownPayLoad) AS DownPayLoadno FROM phone_db WHERE logdate='2018_05_01';                #統計總下行流量
hive> select * from phone_db_UpPayLoad_2018_05_01;
hive> select * from phone_db_DownPayLoad_2018_05_01;

結果如下圖所示。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章