ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

电信手机流量数据分析

2019-09-10 21:40:17  阅读:369  来源: 互联网

标签:数据分析 regMatch group string python db 流量 t% 电信


电信手机流量数据分析

实验环境

  • 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;

结果如下图所示。
在这里插入图片描述

标签:数据分析,regMatch,group,string,python,db,流量,t%,电信
来源: https://blog.csdn.net/u014552259/article/details/95630635

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有