上网数据

1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681200

1363157995052 13826544101 5C-0E-8B-C7-F1-E0:CMCC 120.197.40.4 4 0 264 0 200
1363157991076 13926435656 20-10-7A-28-CC-0A:CMCC 120.196.100.99 2 4 132 1512 200
1363154400022 13926251106 5C-0E-8B-8B-B1-50:CMCC 120.197.40.4 4 0 240 0 200
1363157993044 18211575961 94-71-AC-CD-E6-18:CMCC-EASY 120.196.100.99 iface.qiyi.com 视频网站 15 12 1527 2106 200
1363157995074 84138413 5C-0E-8B-8C-E8-20:7DaysInn 120.197.40.4 122.72.52.12 20 16 4116 1432 200
1363157993055 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 18 15 1116 954 200
1363157995033 15920133257 5C-0E-8B-C7-BA-20:CMCC 120.197.40.4 sug.so.360.cn 信息安全 20 20 3156 2936 200
1363157983019 13719199419 68-A1-B7-03-07-B1:CMCC-EASY 120.196.100.82 4 0 240 0 200
1363157984041 13660577991 5C-0E-8B-92-5C-20:CMCC-EASY 120.197.40.4 s19.cnzz.com 站点统计 24 9 6960 690 200
1363157973098 15013685858 5C-0E-8B-C7-F7-90:CMCC 120.197.40.4 rank.ie.sogou.com 搜索引擎 28 27 3659 3538 200
1363157986029 15989002119 E8-99-C4-4E-93-E0:CMCC-EASY 120.196.100.99 www.umeng.com 站点统计 3 3 1938 180 200
1363157992093 13560439658 C4-17-FE-BA-DE-D9:CMCC 120.196.100.99 15 9 918 4938 200
1363157986041 13480253104 5C-0E-8B-C7-FC-80:CMCC-EASY 120.197.40.4 3 3 180 180 200

数据一共有11列,每一列的说明如图

要求:求每一个用户的上行数据包数总量,下行数据包数总量,上行总流量,下行总流量

分析:

1、按照用户进行排序,

2、将不同时间段的相同用户进行分组

3、相同的用户的上网流量进行相加

下面我们将通过两种方式进行操作,虽然方式不同,但思想很重要

1、普通方法(shell 方法)

由于是找出每个用户的上网流量,所以我们对数据进行了提取,只提取手机号、上行包、下行包、上行流量、下行流量

cat file|awk -F\\t '{print $2,$7,$8,$9,$10}'

排序

cat file|awk -F\\t '{print $2,$7,$8,$9,$10}'|sort -k 2

13480253104 3 3 180 180
13502468823 57 102 7335 110349
15 9 918 4938
18 15 1116 954
13600217502 18 138 1080 186852
13602846565 15 12 1938 2910
13660577991 24 9 6960 690
13719199419 4 0 240 0
13726230503 24 27 2481 24681
13760778710 2 2 120 120
13823070001 6 3 360 180
13826544101 4 0 264 0
13922314466 12 12 3008 3720
13925057413 69 63 11058 48243
13926251106 4 0 240 0
13926435656 2 4 132 1512
15013685858 28 27 3659 3538
15920133257 20 20 3156 2936
15989002119 3 3 1938 180
18211575961 15 12 1527 2106
18320173382 21 18 9531 2412
84138413 20 16 4116 1432

分组

对于上面排好的数据进行分组,就行把相同的用户的流量合并的一起(没有相加计算,只是简单的放在一起),如

13480253104 3 3 180 180
13502468823 57 102 7335 110349
13560439658 [15 9 918 4938] [18 15 1116 954]

shell中的分组可以利用awk 中的数组

相同用户流量相加

cat HTTP_20130313143750.dat |sort -k2|awk -F\\t '{print $2,$7,$8,$9,$10}'|awk '{a[$1]+=$2;b[$1]+=$3;c[$1]+=$4;d[$1]+=$5}END{for(i in a)print(i,a[i],b[i],c[i],d[i])}'|sort

13480253104 3 3 180 180
13502468823 57 102 7335 110349
13560439658 33 24 2034 5892
13600217502 18 138 1080 186852
13602846565 15 12 1938 2910
13660577991 24 9 6960 690
13719199419 4 0 240 0
13726230503 24 27 2481 24681
13760778710 2 2 120 120
13823070001 6 3 360 180
13826544101 4 0 264 0
13922314466 12 12 3008 3720
13925057413 69 63 11058 48243
13926251106 4 0 240 0
13926435656 2 4 132 1512
15013685858 28 27 3659 3538
15920133257 20 20 3156 2936
15989002119 3 3 1938 180
18211575961 15 12 1527 2106
18320173382 21 18 9531 2412
84138413 20 16 4116 1432

对于上面的shell脚本我们进行了两次的awk 两次sort,显然没有必要,整理一下

cat HTTP_20130313143750.dat |awk -F\\t '{a[$2]+=$7;b[$2]+=$8;c[$2]+=$9;d[$2]+=$10}END{for(i in a)print(i,a[i],b[i],c[i],d[i])}'|sort

2、由于数据量比较小可以用shell脚本解决,但是数据量大的话,处理时间变长,内存崩溃,这时就需要mr来实现

根据mr的map、reduce 函数的定义,我们很容易的找到这两个阶段的输入、输出

map阶段

输入就是每行的记录

输出是用户 每个时间段的上网流量

reduce阶段

输入是map的输出

输出是相加后的流量和

实现

public static class MyMapper extends Mapper<LongWritable, Text, Text, Text> {
Text k2 = new Text();
Text v2 = new Text();

@Override
protected void map(LongWritable k1, Text v1, Context context)
throws IOException, InterruptedException {
String[] splited = v1.toString().split("\t");
String telno = splited[1];
String uppacknum = splited[6];
String dwpacknum = splited[7];
String uppayload = splited[8];
String dwpayload = splited[9];
String data = uppacknum + "," + dwpacknum + "," + uppayload + ","
+ dwpayload;
k2.set(telno);
v2.set(data);
System.out.println(data);
context.write(k2, v2);
}

}

public static class MyReducer extends Reducer<Text, Text, Text, Text> {
Text v3 = new Text();

@Override
protected void reduce(
Text k2,
Iterable<Text> v2s,
org.apache.hadoop.mapreduce.Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
long uppacknum = 0L;
long dwpacknum = 0L;
long uppayload = 0L;
long dwpayload = 0L;
String data = "";
for (Text v2 : v2s) {

String[] split = v2.toString().split(",");
uppacknum += Long.parseLong(split[0]);
dwpacknum += Long.parseLong(split[1]);
uppayload += Long.parseLong(split[2]);
dwpayload += Long.parseLong(split[3]);
data = uppacknum + "," + dwpacknum + "," + uppayload + ","
+ dwpayload;
System.out.println(data);
}
v3.set(data);
context.write(k2, v3);
}
}

这里用的是hadoop的基本类型,没有自己定义序列化类型

最后的结果

13480253104 3,3,180,180
13502468823 57,102,7335,110349
13560439658 33,24,2034,5892
13600217502 18,138,1080,186852
13602846565 15,12,1938,2910
13660577991 24,9,6960,690
13719199419 4,0,240,0
13726230503 24,27,2481,24681
13760778710 2,2,120,120
13823070001 6,3,360,180
13826544101 4,0,264,0
13922314466 12,12,3008,3720
13925057413 69,63,11058,48243
13926251106 4,0,240,0
13926435656 2,4,132,1512
15013685858 28,27,3659,3538
15920133257 20,20,3156,2936
15989002119 3,3,1938,180
18211575961 15,12,1527,2106
18320173382 21,18,9531,2412
84138413 20,16,4116,1432

 

求相同号码一天内的上网流量——mapreduce的更多相关文章

  1. 代理内网上网-iptables

    代理内网上网-iptables 1.1 环境说明 主机A:(能上网) ip:内172.16.1.7/24 外10.0.0.7/24 系统CentOS 6.9 主机B:(不能上网) ip:内172.16 ...

  2. MapReduce实现手机上网流量分析(业务逻辑)

    一.问题背景 现在的移动刚一通话就可以在网站上看自己的通话记录,以前是本月只能看上一个月.不过流量仍然是只能看上一月的. 目的就是找到用户在一段时间内的上网流量. 本文并没有对时间分组.下一节进行分区 ...

  3. 2D空间中求一点是否在多边形内

    参考自这篇博文:http://www.cnblogs.com/dabiaoge/p/4491540.html 一开始没仔细看做法,浪费了不少时间.下面是最终实现的效果: 大致流程: 1.随便选取多边形 ...

  4. 【长期有效】1分钱抢100M上网流量及iPhone5S免费抽奖

    声明:本活动经作者亲自体验,绝对真实.安全.可靠.下文中图片为手机界面截图,最终得到官方手机流量增加100M的短信通知,回家过年使用最合适! 0.点击下方活动图片,进入“百度钱包”页面,你也可以直接 ...

  5. IDC 内网机器 通 过 iptables SNAT上网的配置方法

    有三台机器, A .B .C,其中A机器有外网和内网IP,B和C只有内网,我们配置B和C二台机器通过A机器来上外网. 假设A机器 外网IP为: 60.12.13.14  内网IP为: 192.168. ...

  6. HDU 1828 Picture(线段树扫描线求周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  7. MySQL中求年龄

    时间函数: 1.curdate() --- 当前系统日期 调取: select curdate() 2.curtime() --- 当前系统时间 调取: select curtime() 3.now( ...

  8. C语言,一个彩票摇奖程序摇出22选5的中奖号码

    摇奖机摇奖,无非就是利用它的随机性,让球从摇奖机中随机地掉出,就成了中奖号码.而C语言中也同样有个rand()函数可以产生随机数,利用这个rand()函数产生的随机数,同样可以代替从摇奖机中随机摇出的 ...

  9. python学习之--内置函数:

    Python内置函数: Python内置了很多有用的函数,我们可以直接调用.要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数. 1. 内置函数调用之--abs()函数: ...

随机推荐

  1. Android AlarmManager类的应用(实现闹钟功能)

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  2. LINUX下的MYSQL默认表名区分大小写

    让MYSQL不区分表名大小写的方法其实很简单: 1.用ROOT登录,修改/etc/my.cnf,该文件的路径也可能是/usr/my.cnf. 2.加入一行:lower_case_table_names ...

  3. JS实现 页面提交防刷新等待提示

    //关闭等待窗口 function closediv() { //Close Div document.body.removeChild(document.getElementById("b ...

  4. [原]最短路专题【基础篇】(updating...)

    hud1548 a strange lift  最短路/bfs  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:一个奇怪的电梯,每层楼的 ...

  5. 判断线段相交 -- 51nod 1264 线段相交

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 三角形的有向面积:a.x*b.y+b.x*c.y+c.x*a.y ...

  6. linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用

    ---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10  一.虚拟网络三种连接方式 当在V ...

  7. leetcode:Palindrome Linked List

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

  8. java中final关键字

    一.final修饰方法 禁止任何继承类修改它的定义,保证在继承中使方法行为保持不闲并且不会被覆盖. final修饰的方法,同意编译器针对该方法的调用转为内嵌调用.(类似c++ 中的inline?) p ...

  9. AWS 之Load Balance篇

    public class CreateELB { /// <summary> /// 连接AWS服务器 /// </summary> /// <param name=&q ...

  10. Debian 如何更改hdmi接口输出的分辨率

    1. 先删除无用的文件: a) Boot/boot.src b) Boot/script.bin 2. 打开boot/script.fex,找到disp_init节点 a) 将screenX_outp ...