java版数据分析--上网日志流量统计

news/2024/11/24 8:53:07/

在给的 http.log 日志文件中,是电信运营商记录用户上网访问某些网站行为的日志记录数据,一条数据中有多个字段用空格分隔。

例如: “18611132889 http://v.baidu.com/tv 20 5000”
是一条上网行为,第一个字段代表手机号码,第二个字段代表请求网站的 URL ,第三个字段代表请求发送的数据即上行流量( 20
字节),第四个字段代表服务器响应给用户的流量即下行流量( 5000 字节)。

数据

![](https://img-
blog.csdn.net/20180501171359247?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3OTMzMDE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

手机段规则

![](https://img-
blog.csdn.net/20180501171409673?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3OTMzMDE4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

需求:

  1. 计算出用户上网流量总流量(上行 + 下行)最高的的网站 Top3 ,

  2. 根据给的的手机号段归属地规则,计算出总流量最高的省份 Top3

  3. 根据给的的手机号段运营商规则,计算出总流量最高的运营商 Top3

步骤分析:

1 将手机号规则信息放在 Map 集合中,以手机号为 key ,手机数据实体为 value 。

2 加载 http 日志数据,获取 url 和手机号数据( url 需要简单清洗)

3 处理 url 数据,统计流量

4 根据 http 日志文件中的手机号匹配获取对应的区域运营商数据,进行统计

知识点:

集合 list 和 map 存储数据特点

IO 切割

1.1. ** 创建两个实体 bean 来存储手机号规则数据和上网数据 **

HttpBean pojo

** private ** String phone ; // 手机号

** private ** String url ; // 请求的 _ url _

** private ** ** int ** upData ; // 上行流量

** private ** ** int ** lowData ; // 下行流量


TelBean

** private ** String prefix ;

** private ** String phone ;

** private ** String province ;

** private ** String city ;

** private ** String isp ;

** private ** String postCode ;

** private ** String cityCode ;

** private ** String areaCode ;


1.2. ** 读取手机号规则数据 将数据封装到 Map 中 **

/**

  • 将 _ Tel _ 放在 map 中

  • ** @return **

*/

** public ** ** static ** Map<String, TelBean> getTelMap() {

Map<String, TelBean> map = ** new ** HashMap<>();

** try ** (BufferedReader bfr = ** new ** BufferedReader( ** new **
FileReader( “d:/data/ 手机号段规则 .txt” ))😉 {

String line = ** null ** ;

bfr .readLine();

** while ** (( line = bfr .readLine()) != ** null ** ) {

// System.out.println(line);

String[] split = line .split( “\s” );

String prefix = split [0];

String phone = split [1]; // 七位

String province = split [2];

String city = split [3];

String isp = split [4];

String postCode = split [5];

String cityCode = split [6];

String areaCode = split [7];

TelBean telBean = ** new ** TelBean( prefix , phone , province ,
city , isp , postCode , cityCode , areaCode );

map .put( phone , telBean ); // key 七位的手机号

}

} ** catch ** (Exception e ) {

// ** TODO ** Auto-generated catch block

e .printStackTrace();

}

** return ** map ;

}


1.3. ** 将手机号规则数据存储在 list 中 **

/**

  • 返回 _ Tel _ 的 list 数据

  • ** @return **

*/

** public ** ** static ** List getTelList() {

List list = ** new ** ArrayList<>();

** try ** (BufferedReader bfr = ** new ** BufferedReader( ** new **
FileReader( “d:/data/ 手机号段规则 .txt” ))😉 {

String line = ** null ** ;

bfr .readLine();

** while ** (( line = bfr .readLine()) != ** null ** ) {

// System.out.println(line);

String[] split = line .split( “\s” );

String prefix = split [0];

String phone = split [1];

String province = split [2];

String city = split [3];

String isp = split [4];

String postCode = split [5];

String cityCode = split [6];

String areaCode = split [7];

TelBean telBean = ** new ** TelBean( prefix , phone , province ,
city , isp , postCode , cityCode , areaCode );

list .add( telBean );

}

} ** catch ** (Exception e ) {

// ** TODO ** Auto-generated catch block

e .printStackTrace();

}

** return ** list ;

}


由于 List 集合和 Map 集合存储数据的特点不同 , 此案例我们选择使用 map 集合

List 需要根据手机号获取其对应的区域需要遍历并匹配手机字段

Map 存储手机号规则数据 , 可将手机号作为 key , TelBean 为 value 数据 , 直接根据 key
来获取其对应的区域信息

1.4. ** 统计 url 的访问流量 **

/**

  • 统计 URl 结果

  • ** @return **

*/

** public ** ** static ** Map<String,Integer> getUrlResult() {

// 统计各个 _ url _ 的访问量数据

Map<String,Integer> urlMap = ** new ** HashMap<>();

** try ** (BufferedReader bfr = ** new ** BufferedReader( ** new **
FileReader( “d:/data/http.log” ))😉{

String line = ** null ** ;

** while ** (( line = bfr .readLine())!= ** null ** ){

//System.out.println(line);

String[] split = line .split( “\s” );

String _ phone _ = split [0];

String urlStr = split [1];

String upDateStr = split [2];

String lowDataStr = split [3];

// 处理 _ url _ 数据 清洗掉数据格式不正确的数据

String[] split2 = urlStr .split( “\.” );

** if ** ( split2 . length >=3){ // 如果 _ url _ 包含两个 点

String url = split2 [1];

Integer sum = ** urlMap .getOrDefault( url , 0); **

sum += Integer. _ parseInt _ ( upDateStr )+Integer. _ parseInt _ (
lowDataStr );

urlMap .put( url , sum ); // 结果数据

}

}

} ** catch ** (Exception e ) {

// ** TODO ** Auto-generated catch block

e .printStackTrace();

}

** return ** urlMap ;

}


1.5. 统计省份和运营商的访问流量统计

** static ** Map<String, TelBean> _ telMap _ ;

** static ** {

_ telMap _ = TelAdmin. _ getTelMap _ ();

}

** public ** ** static ** ** void ** main(String[] args ) {

// 存储省份结果

Map<String,Integer> pMap = ** new ** HashMap<>();

// 存储运营商结果

Map<String,Integer> ispMap = ** new ** HashMap<>();

// 存储统计 _ url _ 结果

Map<String,Integer> urlMap = ** new ** HashMap<>();

** try ** (BufferedReader bfr = ** new ** BufferedReader( ** new **
FileReader( “d:/data/http.log” ))😉{

String line = ** null ** ;

** while ** (( line = bfr .readLine())!= ** null ** ){

//System.out.println(line);

String[] split = line .split( “\s” );

String phone = split [0];

String urlStr = split [1];

String upDateStr = split [2];

String lowDataStr = split [3];

String tel = phone .substring(0, 7);

TelBean telBean = _ telMap _ .get( tel );

String province = telBean .getProvince(); // 省份

Integer tatol1 = pMap .getOrDefault( province , 0);

tatol1 +=Integer. _ parseInt _ ( upDateStr )+Integer. _ parseInt _ (
lowDataStr );

pMap .put( province , tatol1 );

String isp = telBean .getIsp(); // 运营商

Integer tatol2 = ispMap .getOrDefault( isp , 0);

tatol2 +=Integer. _ parseInt _ ( upDateStr )+Integer. _ parseInt _ (
lowDataStr );

ispMap .put( isp , tatol2 );

String[] split2 = urlStr .split( “\.” );

** if ** ( split2 . length >=3){

String url = split2 [1];

//System.out.println( _ url _ );

Integer tatol = urlMap .getOrDefault( url , 0);

tatol += Integer. _ parseInt _ ( upDateStr )+Integer. _ parseInt _ (
lowDataStr );

urlMap .put( url , tatol );

}

}

// 对结果集 map 排序 获取想要的结果

ispMap .entrySet();

pMap .entrySet();

urlMap .entrySet();

} ** catch ** (Exception e ) {

// ** TODO ** Auto-generated catch block

e .printStackTrace();

}


1.6. **map 排序工具类 **

** public ** ** static ** ArrayList<Entry<String, Integer>>
sort(Map<String,Integer> map ){

Set<Entry<String, Integer>> entrySet = map .entrySet();

ArrayList<Entry<String, Integer>> list = ** new ** ArrayList<>( entrySet
);

Collections. _ sort _ ( list , ** new ** Comparator<Entry<String,
Integer>>() {

@Override

** public ** ** int ** compare(Entry<String, Integer> o1 , Entry<String,
Integer> o2 ) {

** return ** o2 .getValue().compareTo( o1 .getValue());

}

});

** return ** list ;

}


在这里插入图片描述


http://www.ppmy.cn/news/881431.html

相关文章

运营商级电信增值短彩流量监控营销平台

运营商级电信增值短彩流量监控营销平台 平台功能 一、短信网关 (一)通信程序模块(C/S结构) 1. 严格依据各运营商通信协议开发实现各项功能,支持网络异常处理并记录异常原因,自动检测自动连接。 2. 支持多线程收发短信。 3. 支持非法字符过虑引擎。 4. …

女士手机一夜跑流量50GB原因是什么

据报道&#xff0c;武汉用户陈女士手机一夜跑流量50GB&#xff0c;武汉电信与手机售后技术人员立即展开调查。调查发现&#xff1a;用户手机11月累计使用流量54.4GB&#xff0c;其中通过“个人热点”消耗的流量达到53.5GB。据了解&#xff0c;陈女士手机号码在11月11日晚10时26…

大数据概述及电信大数据应用

一&#xff1a;大数据的应用场景 马云&#xff1a;IT行业走向DT(Data technology)时代 2015 大数据峰会&#xff1a; 过去7年我们从互联网创业到互联网产业&#xff0c;很快进入互联网经济&#xff0c; 而且正在从IT走向DT时代&#xff0c;也许昨天称为IT领袖峰会&#xff0c;…

【kubernetes系列】Kubernetes之Ingress

概述 从前面的学习&#xff0c;我们可以了解到Kubernetes暴露服务的方式目前常见的只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff1b;而我们需要将集群内服务提供外界访问就会面临以下几个问题&#xff1a; Pod 漂移问题 Kubernetes 具有强大…

hive实战演练:手机流量统计

hive 本质上是一个 sql 解析引擎 &#xff0c;提供了一种类sql语言 hql 以便于使用&#xff0c;将我们熟悉的sql语言 转换成了 一个个map-reduce进程 需求 &#xff1a; 统计如下文件中 每个手机号使用流量的情况  待处理文件&#xff1a;http.dat 下载地址&#xff1a;h…

php 如何计算上网流量,手机流量是怎么计算上网流量的?

互联网时代&#xff0c;手机流量是我们生活中必不可少的一部分。但是包括小编本人的很多小伙伴&#xff0c;经常觉得自己每个月的流量使用情况都是很懵逼的。“我没怎么花流量啊&#xff0c;咋突然就告诉我剩余不足100M”“就刷了一会儿微博&#xff0c;短信提示就来了”… 到底…

2023-07-14力扣今日三题-赶上了

链接&#xff1a; 1419. 数青蛙 题意&#xff1a; 给定一个字符串&#xff0c;每个入口会顺序读入c r o a k 读完一个以后才能读入下一个&#xff0c;求要有多少个入口才能读完这个字符串&#xff0c;非法输入输出-1 解&#xff1a; 一共五个字符&#xff0c;且不重复&…

AF自动对焦的校正,需根据时机进行!

1.客户更换Lens或VCM可能需要重新调整AF Table 2.在某一距离对焦不良也需要重新调整AF参数 3.画面不清晰以及锐利度不好也有可能是AF的问题 因为AF取决于Lens&#xff0c;而Lens有DOF(景深)的范围&#xff0c;如果客户用很差的Lens或VCM 是无法调好的&#xff0c;AF跟程序有关系…