在给的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 切割
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 ;
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;
}
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来获取其对应的区域信息
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;
}
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();
}
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版数据分析--上网日志流量统计】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/xwnews/338.html 资讯 企业新闻 行情 企业黄页 同类资讯 首页 网站地图 返回首页 物流园资讯移动站 http://mip.xhstdz.com/ , 查看更多