求相同号码一天内的上网流量——mapreduce

上网数据

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
13560439658 15 9 918 4938
13560439658 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

 

时间: 2024-10-10 21:32:44

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

结合手机上网流量业务来说明Hadoop中的自定义数据类型(序列化、反序列化机制)

大家都知道,Hadoop中为Key的数据类型必须实现WritableComparable接口,而Value的数据类型只需要实现Writable接口即可:能做Key的一定可以做Value,能做Value的未必能做Key.但是具体应该怎么应用呢?--本篇文章将结合手机上网流量业务进行分析. 先介绍一下业务场景:统计每个用户的上行流量和,下行流量和,以及总流量和. 本次描述所用数据: 日志格式描述: 日志flowdata.txt中的具体数据: 接下来贴出详细代码,代码中含有详细注释,从代码中可以看出,

结合手机上网流量业务来说明Hadoop中的二次排序机制,分区机制

本篇博客将结合手机上网流量业务来详细介绍Hadoop的二次排序机制.分区机制,先介绍一下业务场景: 先介绍一下业务场景:统计每个用户的上行流量和,下行流量和,以及总流量和. 本次描述所用数据: 日志格式描述: 日志flowdata.txt中的具体数据: 首先我们先通过mapreduce程序实现上面的业务逻辑: 代码实现: package FlowSum; import java.io.DataInput; import java.io.DataOutput; import java.io.IOE

MapReduce实现手机上网流量分析

一.问题背景 现在的移动刚一通话就可以在网站上看自己的通话记录,以前是本月只能看上一个月.不过流量仍然是只能看上一月的. 目的就是找到用户在一段时间内的上网流量. 本文并没有对时间分组. 二.数据集分析 可以看出实际数据集并不是每个字段都有值,但是还好,完整地以tab隔开了,数据格式还是不错的,我们需要的上行下行数据都有,没有缺失值.其实这个需要在程序中处理,如果不在的话 该怎么办. 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196

怎么统计域账户的上网流量?

微软的AD域控方案给企业的信息管理带来了很大的便利.但是由于域控并不能进行上网行为管理,企业的上网行为管理一般还需要专业的上网行为管理产品.用域账号登陆电脑,那么如何统计管理这个账号的上网流量呢? 配置好域控制器的相关地址,根据域账号实现监控. 点击对应的实时带宽数字进去,就可以看到这些流量用在了什么地方.(这个是网页下载) 如果做统计,有的局域网设备不固定,每人分配一个域账号,统一管理,那么上网管理统计也可以结合这个域账号.

日志分析 &nbsp; 取出访问最多的IP,URL,以及五分钟内的访问流量

日志分析! 对最近五分钟的日志进行分析,取出访问最多的IP,URL,以及五分钟内的访问流量 #!/bin/sh name=`cat /etc/salt/minion | grep "^id" | awk '{print $2}'` ipaddr=`/sbin/ifconfig | grep "inet addr" | egrep -v "10\.|127\." | awk  -F'[: ]+' '{print $4}'` #LogPath='/u

Squid显式代理实现内网上网

一.Squid显式代理上网 Squid显式代理,监听某地址的3128活着8080端口,需要内网用户在浏览器上手动设置代理配置.内网pc只需要保证能路由可达Squid监听的地址即可,无需配置dns,内网pc的所有访问流量都通过浏览器出去(包括DNS解析). 二.配置 拓扑: (该模式下squid单臂部署,路由模式也是没问题的,但需要保证squid能正常上网) ①安装squid  [[email protected] ~]#   yum  install  -y  squid ②配置squid的配置

求 区间[a,b]内满足p^k*q*^m(k&gt;m)的数的个数

题目描述: 1<=a,b<=10^18,p,q都是素数  2<=p,q<=10^9; 求在[a,b]内可以表示为  x*p^k*q^m  k > m   的数的个数 分析: 由于要小于b,因此m一定小于 log10(b)/log10(p*q); 因此我们可以枚举m,中间计数的时候需要用到容斥. 具体看代码: #include <iostream> #include <cstdio> #include <cmath> #include <

求批处理统计文件夹内的所有文件的数量和总大小

我最近电脑不知道为什么磁盘空间会慢慢的变小,而且过一段时间之后,又会有两三GB的空间被释放出来,使用我想监控下,看看是那个文件夹下产生的文件来占用我的存储空间,我想按层监视,最终找出原因. 从网上找个命令行显示指定文件夹目录的大小的批处理程序,但是发现并不太尽人意,总感觉不是很适合我的使用: 第一个程序,可以显示某个文件夹下的文件大小,但是我想按层显示,却不能满足我的要求,程序如下: @echo off echo. set /p dirPath=please input folder path:

如何统计局域网上网流量,以及流量明细?

流量统计,顾名思义,就是统计某一段时间内各个上网设备(电脑,手机,移动PAD),或者一个网段的上网设备使用了多少流量,这些流量都用在哪些网络协议上了.可以有两种方法查看1,通过综合数据报表查看,针对整个局域网的流量使用明细(部分截图) 2.通过分类统计 分类统计里面还可以选择根据数据流量明细统计,也是一目了然.