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

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

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

数据

 

手机段规则

 

需求:

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

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

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

步骤分析:

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

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

3 处理url数据,统计流量

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

知识点:

集合 listmap存储数据特点

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 getTelMap() {

Map 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

/**

 * 返回Tellist数据

 * @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存储手机号规则数据,可将手机号作为keyTelBeanvalue数据,直接根据key来获取其对应的区域信息

 

1.4. 统计url的访问流量

/**

 * 统计URl结果

 * @return

 */

public static Map getUrlResult() {

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

Map 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 telMap ;

static{

telMap = TelAdmin.getTelMap();

}

 

public static void main(String[] args) {

//存储省份结果

Map pMap = new HashMap<>();

//存储运营商结果

Map ispMap = new HashMap<>();

//存储统计url结果

Map 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> sort(Map map){

Set> entrySet = map.entrySet();

ArrayList> list = new ArrayList<>(entrySet);

Collections.sort(list,new Comparator>() {

@Override

public int compare(Entry o1, Entry o2) {

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

}

});

return list;

}

你可能感兴趣的:(java版数据分析--上网日志流量统计)