热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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 {

	//实际处理中已经进行了数据清洗 在这就不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格式是,我们需要便利value结合,廉价上行流量得到上行总流量,廉价下行流量得到下行总刘玲,那么最总得流量是上下行总得和。

3.4 Main

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

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

四、实验分析

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


推荐阅读
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
author-avatar
mobiledu2502884633
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有