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

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

下面我们开始统计链接的点击量,并做排序。

我们统计记录的时候,为了防止空记录等异常的情况,我们创建一条空记录

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

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


首先获取我们想要的uri


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,然后我们输出

uriCounts.collect.foreach(print)

c6adf927781e2d36359a90c9ddbef6f3.jpg

下面我们统计点击量



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


rdd转换为数组




val uriToCount = uriCounts.collect


数组转换为序列并排序



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

12db63d9f311b7e591c2d0982b203945.jpg

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

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

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

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

3d215861311bc5e15689c4a0f89d9bf5.jpg

输出

uriHitCount.take(10).foreach(println)

90a982b316ddbdf4e37a4b73d552881c.jpg

上面便是排序的结果

点击最高的uri
如果想得出点击最高的uri

uriHitCount.take(1).foreach(println)

563df5644efa45cd8d8a3ec05c4785c2.jpg

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

知识补充:

Scala代码看上去很少,但是内容却是很丰富的。上面用到的相关知识,这里补充,供大家能看懂上面代码


getOrElse:

println(a.get("k1").getOrElse("default")) //根据key读取元素,不存在就替换成默认值


在Spark中写法是:persons.getOrElse("Spark",1000) //如果persons这个Map中包含有Spark,取出它的值,如果没有,值就是1000。


reduce、reduceByKey


reduce(binary_function)

reduce将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止。


val c = sc.parallelize(1 to 10)
c.reduce((x, y) => x + y)//结果55


具体过程,RDD有1 2 3 4 5 6 7 8 9 10个元素,

1+2=3

3+3=6

6+4=10

10+5=15

15+6=21

21+7=28

28+8=36

36+9=45

45+10=55


reduceByKey(binary_function)

reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行binary_function的reduce操作,因此,Key相同


的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。

val a = sc.parallelize(List((1,2),(1,3),(3,4),(3,6)))

a.reduceByKey((x,y) => x + y).collect

//结果 Array((1,5), (3,10))



Seq


Sequence都有一个预定义的顺序。

scala> Seq(1, 1, 2)

res3: Seq[Int] = List(1, 1, 2)

(注意返回的结果是一个List。Seq是一个trait;List是它的一个实现类。Seq对象是一个工厂对象,正如你所看到


的,它会创建一个List。)


集合之间可以相互进行转换。

def toArray : Array[A]

def toArray [B >: A] (implicit arg0: ClassManifest[B]) : Array[B]

def toBuffer [B >: A] : Buffer[B]

def toIndexedSeq [B >: A] : IndexedSeq[B]

def toIterable : Iterable[A]

def toIterator : Iterator[A]

def toList : List[A]

def toMap [T, U] (implicit ev: <:<[A, (T, U)]) : Map[T, U]

def toSeq : Seq[A]

def toSet [B >: A] : Set[B]

def toStream : Stream[A]

def toString () : String

def toTraversable : Traversable[A]


我们可以把一个Map转换成一个数组,然后得到一个键值对数组。


scala> Map(1 -> 2).toArray

res41: Array[(Int, Int)] = Array((1,2))


sortWith

排序操作(sorted, sortWith, sortBy)根据不同的条件对序列元素进行排序。更多排序内容推荐参考

Scala的map实现key和value排序及各种排序比较等知识讨论

http://www.aboutyun.com/forum.php?mod=viewthread&tid=22942

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
监控 安全 BI
防火墙事件日志及日志分析
在网络安全防护体系中,防火墙作为抵御外部威胁的第一道防线,其重要性不言而喻。而对防火墙日志进行分析,更是深入了解网络流量、发现潜在安全风险的关键手段。
1058 1
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
743 9
|
监控 容灾 算法
阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化
本文探讨了如何高效、经济且可靠地将海外应用与基础设施日志统一采集至阿里云日志服务(SLS),解决全球化业务扩展中的关键挑战。重点介绍了高性能日志采集Agent(iLogtail/LoongCollector)在海外场景的应用,推荐使用LoongCollector以获得更优的稳定性和网络容错能力。同时分析了多种网络接入方案,包括公网直连、全球加速优化、阿里云内网及专线/CEN/VPN接入等,并提供了成本优化策略和多目标发送配置指导,帮助企业构建稳定、低成本、高可用的全球日志系统。
1596 55
|
SQL 监控 关系型数据库
MySQL日志分析:binlog、redolog、undolog三大日志的深度探讨。
数据库管理其实和写小说一样,需要规划,需要修订,也需要有能力回滚。理解这些日志的作用与优化,就像把握写作工具的使用与运用,为我们的数据库保驾护航。
1063 23
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
1124 5
图解MySQL【日志】——Redo Log
|
缓存 Java 编译器
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1973 13
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
11321 2