数据分析案例-IP需求分析

 

要求:通过计算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);
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值