现在的移动刚一通话就可以在网站上看自己的通话记录,以前是本月只能看上一个月。不过流量仍然是只能看上一月的。
目的就是找到用户在一段时间内的上网流量。
本文并没有对时间分组。下一节进行分区,有兴趣的参看下一篇。
可以看出实际数据集并不是每个字段都有值,但是还好,完整地以tab隔开了,数据格式还是不错的,我们需要的上行下行数据都有,没有缺失值。其实这个需要在程序中处理,如果不在的话 该怎么办。
首先看咱们的目的是统计每个人的上行总流量和下行总流量以及上下行总流,上下行=上行+下行,这个是有意义的,因为我们并不能实时得到自己的上网流量,这个说的有点大了,我们并没有六式计算,或者说是为了实现。
输入的key是行号,一般是Object和LongWritable,一般输入的key没啥用,数据集市一行一行文本,输入value是text,输入以电话号码为key,那么是text,输出value包含三类信息,上行总、下行总和总,可以封装在数组中,但是这样很不利于修改,比如说项目经历要你增加一些属性要显示,或者减少一些,一般用bean。
bean要能在网络间传输,需要实现hadoop的writable接口,那么首先实现接口的方法,
write就是序列化,吧对象写入到字节流,注意String类型并没有对性的writeString算法,可以用通用的writeUTF方法,证书类型用long,又对影的writeLong。
readFile就是反序列化,从硬盘或者网络读出,然后赋值给对象,注意读的时候不需要参数,比如
这样是错误的,想想看对象都成字节流,怎么能看得出是什么,所以是按顺序来判断对应属性的,但是每个属性攒了多少个字节呢,这就要靠属性的类型来确定了,这就想分配内存一样,以上纯属个人理解。
那么bean有什么属性呢?需要手机号码,上行、下行,以及赞自己见得总流量,然后产生getter和setter;mapper提交的时候就提交DataBean,这就需要有参数的够着方法,不能每次都setter,另外mapper写入的时候通过反射机制得到实例化的dataBean,那么我们就需要午餐的默认垢找方法。
另外写入databean的时候默认输出类名+hashcode值,这不是我们需要的,所以重写toString方法,eclipse可以自动生成。
reducer的输入类型就是mapper的输出类型,分别是text和databean,他的输出类型野是text和databean。
这其实就是业务逻辑复杂一些的wordcount,mapper提交到reducer的已合并相同key格式是<telNo,{{up1,dw1},{up2,dw2}}>,我们需要便利value结合,廉价上行流量得到上行总流量,廉价下行流量得到下行总刘玲,那么最总得流量是上下行总得和。
可以直接在eclipse里,new reducer driver,就是main函数了,为什么main里总是要new conf,这是为了给本job个性化配置,通过conf.set也是kv对,否则就找全聚德conf。
另外注意写路径的时候加上hdfs://hostname:8020,因为没有上下文的FileSystem,所以必须加,否则认为是本地的file,提示找不到。
可以从原始数据找到一个用户的两条或者多交记录,求和,然后对比,看看业务逻辑对不。