要求:通过计算access.log中的用户行为数据,
统计出各个省份访问量(一次请求记作一次独立的访问量),
并按照各个省份的访问量的从高到低进行排序
给定的access.log是电信运营商的用户上网数据,第一个字段是时间,第二个字段是ip地址,
access.log
20090121000132095572000|125.213.100.123|show.51.com
20090121000132124542000|117.101.215.133|www.jiayuan.com
20090121000132406516000|117.101.222.68|gg.xiaonei.com
20090121000132581311000|115.120.36.118|tj.tt98.com
20090121000132864647000|123.197.64.247|cul.sohu.com
20090121000133296729000|222.55.57.176|down.chinaz.com
20090121000133331104000|123.197.66.93|www.pkwutai.cn
20090121000133446262000|115.120.12.157|v.ifeng.com
20090121000133456256000|115.120.7.240|cqbbs.soufun.com
20090121000133586141000|117.101.219.241|12.zgwow.com
20090121000133744103000|123.197.49.171|2.82yyy.com
--------------------------------------
ip.txt是ip地址和归属地的规则数据,里面的数据是根据ip地址的十进制从高到低排序。
第一个字段是网段的起始IP地址,第二个字段是网段的结束IP地址,
第三个字段是网段的起始IP地址对应的十进制,第四个字段是网段的结束IP地址对应的十进制,
第五个字段代表洲,第六个代表国家,第七个代表省,第八个代表城市,其他字段可以忽略不计
ip.txt
1.0.8.0|1.0.15.255|16779264|16781311|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.0.32.0|1.0.63.255|16785408|16793599|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.1.0.0|1.1.0.255|16842752|16843007|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.2.0|1.1.7.255|16843264|16844799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.1.8.0|1.1.63.255|16844800|16859135|亚洲|中国|广东|广州||电信|440100|China|CN|113.280637|23.125178
1.2.0.0|1.2.1.255|16908288|16908799|亚洲|中国|福建|福州||电信|350100|China|CN|119.306239|26.075302
1.2.2.0|1.2.2.255|16908800|16909055|亚洲|中国|北京|北京|海淀|北龙中网|110108|China|CN|116.29812|39.95931
1.2.4.0|1.2.4.255|16909312|16909567|亚洲|中国|北京|北京||中国互联网信息中心|110100|China|CN|116.405285|39.904989
------------------------------------------------------------------------
5.1 需求分析
通过计算access.log中的用户行为数据,
统计出各个省份访问量(一次请求记作一次独立的访问量),
并按照各个省份的访问量的从高到低进行排序
Util类
public class Util {
public static long strIpToLongIp(String str) {
if(str==null) {
return 0L;
}
long newIp = 0;
String[] split = str.split("\\.");
for (int i = 0; i < 4; i++) {
long lL = Long.parseLong(split[i]);
//a|=b的意思就是把a和b按位或然后赋值给a
newIp |= lL << ((3-i) << 3);
}
return newIp;
}
}
测试类
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Demo1 {
public static void main(String[] args) throws Exception {
//1.读文件
//br1负责读ip文件 br2负责读access.log 5万次 2亿次
BufferedReader br1 = new BufferedReader(new FileReader("D:\\ip.txt"));
BufferedReader br2 = new BufferedReader(new FileReader("D:\\access.log"));
//2.先把数据读进来,存储起来,在处理
//使用一个集合存储用户的访问ip
ArrayList<Long> ips = new ArrayList<>();
String line1 = null;
while ((line1 = br2.readLine()) != null) {
String[] split = line1.split("\\|");
long ip = Util.strIpToLongIp(split[1]);
ips.add(ip);
}
//处理规则数据
HashMap<Long[], String> ruleMap = new HashMap<>();
while ((line1 = br1.readLine()) != null) {
String[] split = line1.split("\\|");
long downIp = Long.parseLong(split[2]);
long upIp = Long.parseLong(split[3]);
String pro = split[6];
Long[] rules = {downIp, upIp};
ruleMap.put(rules, pro);
}
//3.拿ip数据做一个遍历,对比规则数据
HashMap<String, Integer> result = new HashMap<>();
for (Long ip : ips) {
for (Map.Entry<Long[], String> entry : ruleMap.entrySet()) {
String pro = entry.getValue();
Long[] rule = entry.getKey();
if (ip >= rule[0] && ip <= rule[1]) {
if (result.containsKey(pro)) {
Integer cnts = result.get(pro);
cnts++;
result.put(pro, cnts);
} else {
result.put(pro, 1);
}
break;
}
}
}
for (Map.Entry<String, Integer> entry : result.entrySet()) {
System.out.println(entry);
}
}
}