一、测试数据:手机上网日志
1.1 日志
假设我们如下一个日志文件,这个文件的内容是来自某个电信运营商的手机上网日志,文件的内容已经经过了优化,格式比较规整,便于学习研究。
每一行不同的字段又有不同的含义,具体的含义如下图所示:
![51d07cc5c0b3d3286850bc2c1beec38e.png](https://i-blog.csdnimg.cn/blog_migrate/93c1045db58e77c0878c9d86145651d6.jpeg)
1.2 要实现的目标
有了上面的测试数据—手机上网日志,那么问题来了,如何通过map-reduce实现统计不同手机号用户的上网流量信息?通过上表可知,第6~9个字段是关于流量的信息,也就是说我们需要为每个用户统计其upPackNum、downPackNum、upPayLoad以及downPayLoad这个四个字段的数量和,达到以下的显示结果:
一、解决思路
2.1 Writable接口
经过上一篇的学习,我们知道了在Hadoop中操作所有的数据类型都需要实现一个叫Writable的接口,实现了该接口才能够支持序列化,才能方便地在Hadoop中进行读取和写入。
![5918c7bc1e95a244c5eda70089f025ea.png](https://i-blog.csdnimg.cn/blog_migrate/c45e73c5fadd8064abb95da9202417cc.jpeg)
从上面的代码中可以看到Writable 接口只有两个方法的定义,一个是write 方法,一个是readFields 方法。前者是把对象的属性序列化到DataOutput 中去,后者是从DataInput 把数据反序列化到对象的属性中。(简称“读进来”,“写出去”)
java 中的基本类型有char、byte、boolean、short、int、float、double 共7 中基本类型,除了char,都有对应的Writable 类型。但是,没有我们需要的对应类型。于是,我们需要仿照现有的对应Writable 类型封装一个自定义的数据类型,以供本次试验使用。
2.2 封装KpiWritable类型
我们需要为每个用户统计其upPackNum、downPackNum、upPayLoad以及downPayLoad这个四个字段的数量和,而这个四个字段又都是long 类型,于是我们可以封装以下代码:
![48f3c89de3411d3c3aaa1ac601b61de1.png](https://i-blog.csdnimg.cn/blog_migrate/996a3c6507dc4bb66116ef6bc5c90498.jpeg)
通过实现Writable接口的两个方法,就封装好了KpiWritable类型。
三、编程实现:依然MapReduce
3.1 自定义Mapper类
![0f1d0f0acc551fa3425c4e581c60dd26.png](https://i-blog.csdnimg.cn/blog_migrate/f02a0afce3c604fafa9406d5482b2c4e.jpeg)
这里将第6~9个字段的数据都封装到KpiWritable类型中,并将手机号和KpiWritable作为传入下一阶段;
3.2 自定义Reducer类
![d3978c324a1ec42f3977b25acb0afd8d.png](https://i-blog.csdnimg.cn/blog_migrate/3ddb8c4f7b26e7f4c611cf42171eb659.jpeg)
这里将Map阶段每个手机号所对应的流量记录都一一进行相加求和,最后生成一个新的KpiWritable类型对象与手机号作为新的返回;
3.3 完整代码实现
完整的代码如下所示:
![7f9685b7ec23f7a84c64bda715d92879.png](https://i-blog.csdnimg.cn/blog_migrate/f7f4e00b2be1be48d8863a71d3304d41.jpeg)
![81f05ea6a8b6e25f7ce47354b82b0215.png](https://i-blog.csdnimg.cn/blog_migrate/0a13367659e09274c93b67a9fb7966a3.jpeg)
![1dcda3c06d78268ffb06f822a16fc342.png](https://i-blog.csdnimg.cn/blog_migrate/003a21b35a3aa42dec41d73e1d6d3889.jpeg)
![1198ec56a18e36cf587cd11200fd7eea.png](https://i-blog.csdnimg.cn/blog_migrate/c666fc938cc34a2d1b1e3dee5df964d8.jpeg)
3.4 调试运行效果
![3a90ba217fa55119fd326367662b0d53.png](https://i-blog.csdnimg.cn/blog_migrate/7bb90a19664c5c71d66299a28997be95.jpeg)