idea,hadoop,fastjson
1.分析前端数据,找出该平台开播时间最长的十名主播
2.统计该主播们的信息,包括:
- 主播ID(uid)
- 金币数量(gold)
- 总观看pv(watchnumpv)
- 粉丝关注数量(follower)
- 总开播时长(length)
从前端获得的日志文件为Json格式,如图:
1.所以可以采用fastjson进行处理,获取需要的几个核心字段,并且进行异常数值判断
2.由于不需要聚合,只是一个简单的过滤操作,所以只需要map阶段,不需要reduce
3.在maven项目的“src–main–java”目录下new一个package,名为DataClean,在包里新建两个class:
- DataCleanJob
- DataCleanMap
4.DataCleanMap:
5.DataCleanJob:
1.new一个名为VideoInfo的package
2.为了方便统计主播的指标数据,最好是把这些字段整合到一个对象中,这样维护起来比较方便,这样就需要自定义一个writable了——VideoInfoWritable,并且对几个方法进行重写;
而setGold和getGold等方法可以通过idea自动生成: "Generate–setter"或"Generate–getter"即可
VideoInfoWritable:
3.编写map函数对清洗过的数据进行切割,并且整合进k2,v2,其中k2是主播的id,类型为Text,v2类型为VideoInfoWritable
VideoInfoMap:
4.编写reduce方法进行聚合:
VideoInfoReduce:
5.将map和reduce进行组装为job:
VideoInfoJob:
VideoInfoTop10Map.java:
在reduce的过程中,我们需要统计当日各个主播的直播总时长,并且按照总时长的顺序为主播排序。
虽然Hadoop在map和reduce之间会进行一次排序,但是这次排序是按照key值的字典序来排列的,在reduce的输入端,key值是主播id,这样的排序不满足我们的需求,因此,我们用一个HashMap来保存键值对,在其中进行排序,为此我们要实现一个MapUtils类用来处理Map中的数据。
为了方便日志文件的管理,我们可以约定在输入路径的最后以日期结尾,并且将日期和主播id都写进k3之中,为此,需要一个处理日期的类DateUtils。
DateUtils.java:
MapUtils.java:
VideoInfoTop10Reduce.java:
最后,将map和reduce组装在一起:
VideoInfoJobTop10: