专栏名称: About云
about云-为热爱云开发技术人员提供最全面的信息传播和服务平台
目录
相关文章推荐
保险一哥  ·  AI会取代百万保险代理人吗?请看deepse ... ·  2 天前  
掌上长春  ·  突发,这家保险公司解散 ·  2 天前  
掌上长春  ·  突发,这家保险公司解散 ·  2 天前  
保险一哥  ·  中国寿险公司如何应对低利率挑战,deepse ... ·  4 天前  
51好读  ›  专栏  ›  About云

日志分析实战之清洗日志小实例6:获取uri点击量排序并得到最高的url

About云  · 公众号  ·  · 2017-10-21 16:19

正文

问题导读

1.读取日志的过程中,发生异常本文是如何解决的?
2.读取后,如何过滤异常的记录?
3.如何实现统计点击最高的记录?



日志分析实战之清洗日志小实例5:实现获取不能访问url
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22911


下面我们开始统计链接的点击量,并做排序。
我们统计记录的时候,为了防止空记录等异常的情况,我们创建一条空记录

[Bash shell] 纯文本查看 复制代码

?

1
val nullObject = AccessLogRecord( "" , "" , "" , "" , "GET /foo HTTP/1.1" , "" , "" , "" , "" )



下面我们开始找点击量最高的链接。

首先获取我们想要的uri

[Scala] 纯文本查看 复制代码

?

1
2
3
val uriCounts = log.map(p.parseRecord( _ ).getOrElse(nullObject).request)
.map( _ .split( " " )( 1 ))
.filter( _ ! = "/foo" )

上面的代码做一个简单解释:
p.parseRecord(_)解析记录
p.parseRecord(_).getOrElse(nullObject)如何没有取到值,则使用nullObject,也就是我们上面定义的对象
p.parseRecord(_).getOrElse(nullObject).request也就是我们取到uri
.map(_.split(" ")(1))是取到我们过滤的url,过滤掉不想要的版本等信息
.filter(_ != "/foo")则是再次过滤掉/foo[也就是空记录]
这样就获取了uri,然后我们输出

[Scala] 纯文本查看 复制代码

?

1
uriCounts.collect.foreach(print)





下面我们统计点击量

[Scala] 纯文本查看 复制代码

?

1
2
3
4
val uriCounts = log.map(p.parseRecord( _ ).getOrElse(nullObject).request)
.map( _ .split( " " )( 1 ))
.map(uri = > (uri, 1 ))
.reduceByKey((a, b) = > a + b)



rdd转换为数组

[Scala] 纯文本查看 复制代码

?

1
val uriToCount = uriCounts.collect



数组转换为序列并排序

[Scala] 纯文本查看 复制代码

?

1
2
import scala.collection.immutable.ListMap
val uriHitCount = ListMap(uriToCount.toSeq.sortWith( _ . _ 2 > _ . _ 2 ) :_ *)




#############################
这里留下一个问题,如果上面元素不是2,而是为sortWith(_._1 > _._1)是对什么排序

[Scala] 纯文本查看 复制代码

?

1
2
import scala.collection.immutable.ListMap
val uriHitCount = ListMap(uriToCount.toSeq.sortWith( _ . _ 1 > _ . _ 1 ) :_ *)

#############################


输出







请到「今天看啥」查看全文