概述
在给的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日志文件中的手机号匹配获取对应的区域运营商数据,进行统计
知识点:
集合 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<TelBean> getTelList() { List<TelBean> 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; } |
最后
以上就是洁净柠檬为你收集整理的java版数据分析--上网日志流量统计的全部内容,希望文章能够帮你解决java版数据分析--上网日志流量统计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复