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

一、问题背景

  现在的移动刚一通话就可以在网站上看自己的通话记录,以前是本月只能看上一个月。不过流量仍然是只能看上一月的。

  目的就是找到用户在一段时间内的上网流量。

  本文并没有对时间分组。下一节进行分区,有兴趣的参看下一篇。

二、数据集分析

  可以看出实际数据集并不是每个字段都有值,但是还好,完整地以tab隔开了,数据格式还是不错的,我们需要的上行下行数据都有,没有缺失值。其实这个需要在程序中处理,如果不在的话 该怎么办。

1363157985066 	13726230503	00-FD-07-A4-72-B8:CMCC	120.196.100.82	i02.c.aliimg.com		24	27	2481	24681	200
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
1363157984040 	13602846565	5C-0E-8B-8B-B6-00:CMCC	120.197.40.4	2052.flash2-http.qq.com	综合门户	15	12	1938	2910	200
1363157995093 	13922314466	00-FD-07-A2-EC-BA:CMCC	120.196.100.82	img.qfc.cn		12	12	3008	3720	200
1363157982040 	13502468823	5C-0A-5B-6A-0B-D4:CMCC-EASY	120.196.100.99	y0.ifengimg.com	综合门户	57	102	7335	110349	200
1363157986072 	18320173382	84-25-DB-4F-10-1A:CMCC-EASY	120.196.100.99	input.shouji.sogou.com	搜索引擎	21	18	9531	2412	200
1363157990043 	13925057413	00-1F-64-E1-E6-9A:CMCC	120.196.100.55	t3.baidu.com	搜索引擎	69	63	11058	48243	200
1363157988072 	13760778710	00-FD-07-A4-7B-08:CMCC	120.196.100.82			2	2	120	120	200
1363157985066 	13726238888	00-FD-07-A4-72-B8:CMCC	120.196.100.82	i02.c.aliimg.com		24	27	2481	24681	200
1363157993055 	13560436666	C4-17-FE-BA-DE-D9:CMCC	120.196.100.99			18	15	1116	954	200

三、实验分析

3.1Mapper

  首先看咱们的目的是统计每个人的上行总流量和下行总流量以及上下行总流,上下行=上行+下行,这个是有意义的,因为我们并不能实时得到自己的上网流量,这个说的有点大了,我们并没有六式计算,或者说是为了实现。

  输入的key是行号,一般是Object和LongWritable,一般输入的key没啥用,数据集市一行一行文本,输入value是text,输入以电话号码为key,那么是text,输出value包含三类信息,上行总、下行总和总,可以封装在数组中,但是这样很不利于修改,比如说项目经历要你增加一些属性要显示,或者减少一些,一般用bean。

package cn.app.hadoop.mr.datacount;

import java.io.IOException;
import java.text.FieldPosition;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

//第一个处理文本的话一般是LongWritable  或者object
//一行一行的文本是text
//输出的key的手机号 定位Text
//结果是DataBean  一定要实现Writable接口
public class DataCountMapper extends Mapper<LongWritable, Text, Text, DataBean> {

	//实际处理中已经进行了数据清洗 在这就不catch
	public void map(LongWritable key, Text value, Context context)
			throws IOException, InterruptedException {
		String line = value.toString();
		String[] fields = line.split("\t");
		String telNo = fields[1];
		long upPayLoad = Long.parseLong(fields[8]);
		long downPayLoad = Long.parseLong(fields[9]);

		//封装到bean,如果格式不对那么跳过 这里不考虑,假设已经清洗
		DataBean dataBean = new DataBean(telNo,upPayLoad,downPayLoad);

		//但是这种方式  每行都new了一个databena下次并没有释放 很慢
		//能不能在外边new DataBean,每次修改值,如果按以前的思维是不行的,因为指向了
		//同一块内存,没法相加
		//但是在hadoop里是可以的,因为每次写入以后就已经序列化了,下次不一样了
		context.write(new Text(telNo), dataBean);
	}

}

  

3.2 DataBean

  bean要能在网络间传输,需要实现hadoop的writable接口,那么首先实现接口的方法,

//反序列化 deserializable  从字节流独处 赋值给内存
	public void readFields(DataInput in) throws IOException {
		// TODO Auto-generated method stub

		//注意顺序   类型  里面没参数
		//this.telNo = in.readUTF(telNo);是错的

		this.telNo = in.readUTF();
		this.upPayLoad = in.readLong();
		this.downPayLoad = in.readLong();
		this.totalPayLoad = in.readLong();

	}

	//序列化serializable,从内存写入到字节流 或者通过rmi在网上传输
	public void write(DataOutput out) throws IOException {
		// TODO Auto-generated method stub
		//手机号是String,但是没有writeString,用writeUTF
		out.writeUTF(telNo);
		out.writeLong(upPayLoad);
		out.writeLong(downPayLoad);
		out.writeLong(totalPayLoad);
	}

  write就是序列化,吧对象写入到字节流,注意String类型并没有对性的writeString算法,可以用通用的writeUTF方法,证书类型用long,又对影的writeLong。

  readFile就是反序列化,从硬盘或者网络读出,然后赋值给对象,注意读的时候不需要参数,比如

this.telNo = on.readUTF(telNo);

  这样是错误的,想想看对象都成字节流,怎么能看得出是什么,所以是按顺序来判断对应属性的,但是每个属性攒了多少个字节呢,这就要靠属性的类型来确定了,这就想分配内存一样,以上纯属个人理解。

  那么bean有什么属性呢?需要手机号码,上行、下行,以及赞自己见得总流量,然后产生getter和setter;mapper提交的时候就提交DataBean,这就需要有参数的够着方法,不能每次都setter,另外mapper写入的时候通过反射机制得到实例化的dataBean,那么我们就需要午餐的默认垢找方法。

  另外写入databean的时候默认输出类名+hashcode值,这不是我们需要的,所以重写toString方法,eclipse可以自动生成。

	@Override
	public String toString() {
		//电话号码不要了
		return "DataBean [upPayLoad=" + upPayLoad
				+ ", downPayLoad=" + downPayLoad + ", totalPayLoad="
				+ totalPayLoad + "]";
	}

  

3.3 Reducer

  reducer的输入类型就是mapper的输出类型,分别是text和databean,他的输出类型野是text和databean。

  这其实就是业务逻辑复杂一些的wordcount,mapper提交到reducer的已合并相同key格式是<telNo,{{up1,dw1},{up2,dw2}}>,我们需要便利value结合,廉价上行流量得到上行总流量,廉价下行流量得到下行总刘玲,那么最总得流量是上下行总得和。

3.4 Main

  可以直接在eclipse里,new reducer driver,就是main函数了,为什么main里总是要new conf,这是为了给本job个性化配置,通过conf.set也是kv对,否则就找全聚德conf。

  另外注意写路径的时候加上hdfs://hostname:8020,因为没有上下文的FileSystem,所以必须加,否则认为是本地的file,提示找不到。

四、实验分析

  可以从原始数据找到一个用户的两条或者多交记录,求和,然后对比,看看业务逻辑对不。

时间: 2024-12-02 03:45:11

MapReduce实现手机上网流量分析(业务逻辑)的相关文章

MapReduce实现手机上网日志分析(分区)

一.问题背景 实际业务的需要,比如以移动为例,河南的用户去了北京上网,那么他的上网信息默认保存在了北京的基站,那么我们想要查询北京地区的上网日志信息默认也包含了其他地区用户的在本区的上网信息,否则只能扫描日志找到北京,很慢,所以分区很需要. 二.数据集分析 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200 1363157995052 13826

手机上网流量连续4月翻倍增长 短信缩水

文章讲的是手机上网流量连续4月翻倍增长 短信缩水,工信部今日发布<2015年4月份通信业经济运行情况>,其中指出受互联网应用业务替代影响,1-4月,全国移动短信业务量完成2418.8亿条,同比下降3.6%.与之相比月户均移动互联网接入流量突破300M,手机上网流量连续4月翻倍增长.报告中指出,移动短信业务量收持续下滑,移动彩信量小幅增长. ▲2014-2015年4月移动电话去话通话量和移动电话用户同比增长比较 ▲2014-2015年4月移动短信业务量和移动短信收入同比增长情况 ▲2014-20

手机用户对手机上网流量费被莫名其妙扣取反应强烈

近一段时间,手机用户对手机上网流量费被莫名其妙扣取反应强烈,记者也接到多起消费者投诉,比如使用wifi上网也被扣了GPRS流量费用.断掉网络连接也被扣费以及境外接收彩信手机报被扣流量费. 广州移动和相关专家认为,手机在上网过程中,流量消耗不知不觉,消费者感知不强.经过分析,这些情况大多由恶意软件.智能手机自动更新.信号切换.山寨手机等原因导致. 1.断掉网络连接也被扣流量费 有手机用户赵先生称,自己平时很注意上网流量的变化,每次上网后都会断掉"数据连接"的开关,但下个月账单出来后,还是

阿里巴巴推出手机上网流量免费计划

阿里巴巴集团今天宣布,联手联通.移动两大运营商推出手机上网流量免费计划,从11月起,在手机上使用来往.手机淘宝.聚划算.天猫.支付宝等阿里集团相关客户端的用户将可以获得阿里巴巴赠送的每月2G免费流量包. 据悉,流量免费计划首批覆盖包括广东移动.江苏联通.浙江联通.湖南联通等,届时对应地区用户提交手机号即可领取免费流量包.免费计划将先在11.12两个月运行,未来将视试用户体验情况和运营商的支持能力扩大服务范围和运行时限. 免费流量将使阿里巴巴在推广其好来往以及手机淘宝时更有吸引力.由于手机流量费用

第19次中国互联网络发展报告:手机上网网民分析

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 中国互联网络信息中心(CNNIC) 2007年1月23日发布第19次中国互联网络发展状况统计报告.本次调查显示,中国内地网民总人数已达1.37亿人.以下为手机上网网民分析. 截止2006年12月31日,中国通过手机上网的网民人数为1700万人,占网民总数的12.4%.尽管这个数量在13700万人的网民总数中所占比例并不是很高,但这个数据有着深

上海率先取消手机上网流量月底清零条款

曾经广受争议的手机上网流量月清"霸王条款"在上海率先被打破.记者7日获悉,在上海市消费者权益保护委员会的促动下,上海三大运营商自1月计费周期起全部推出手机上网流量季度计费方式.长期以来,三大运营商实行手机上网流量月清的做法备受消费者诟病.上海市消保委在2013年7月对2000名消费者进行的调查显示,54.43%的消费者表示流量月底作废不合理,近七成消费者认为手机流量按月计费的方式不够人性化,应当推行手机流量跨月度计费.针对调查结果,上海市消保委多次与主管部门和运营商沟通,去年8月,移动

不要忽略后台程序 手机上网流量全分析

一直以来,很多 网友反映,为什么明明卸载了UC Web浏览器,而且没有打开任何网络浏览器,为什么还是会走流量,难道是运营商又黑了我?而且随着智能手机的普及,这样的现象也越来越普遍,那么,是否我们不开浏览器不打开网友,就不会产生流量?这些流量又是如何产生的呢?以下的文章我们就来详细的探析一些,究竟是那些功能让手机产生的流量.我们以Android系统智能手机为例,一台崭新的Android系统手机,我们开机后 就会进入到账户设置,而这一过程是需要我们连入网络来实现一些资料的同步的,如果用户没有开启WI

阿里推上网流量免单计划:首批四个省 每月2G

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 新浪科技讯 10月30日上午消息,阿里巴巴今天宣布将对外推出一项手机上网流量免单计划,从11月起,经常在手机上使用阿里巴巴旗下手机淘宝.来往.聚划算.天猫.支付宝等客户端的用户将可以申领阿里巴巴赠送的每月2G的定向免费流量包. 阿里巴巴官方透露,该流量免费计划首批覆盖包括广东移动.江苏联通.浙江联通.湖南联通,届时对应地区的用户提交手机号即可

套餐上网流量不含国际漫游

最近有消息称,一位手机用户国际漫游发15条微博,产生通信费3900元,成为"史上最贵微博".记者从中山三大运营商处了解到,原来套餐内的手机上网流量都是不包含国际漫游上网流量的,在国际漫游状态下上网,需另付流量费.三大运营商针对不同漫游地点的资费标准不同,通常按流量计费,约0.01-0.25元/KB:而电信的WiFi国际漫游业务是计时收费,1元/分钟. 套餐内流量只在省内或国内有效 相信很多手机用户,不论是移动.还是电信或者联通的用户,使用的手机资费套餐都会含有一定上网流量,但南都记者了