网站流量日志分析--统计分析--分组 topN--row_number over 函数使用|学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习网站流量日志分析--统计分析--分组 topN--row_number over 函数使用

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第四阶段) 网站流量日志分析--统计分析--分组 topN--row_number over 函数使用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/696/detail/12231


网站流量日志分析--统计分析--分组 topN--row_number over 函数使用


1、要想解决分组 top n 问题就会提到面向分析的数据库或者数据仓库中一个常见的函数叫做分组函数在数据中可以在每个分组内按照指定的字段排序之后,依次打上步骤号标号比如新增的字段 step每个分组内可以指定按照所谓的字段排序依次打上标号,比如111排第一名,13第二,下面这个六排第三,不管是否重复,只要排序好之后,就按照顺序依次打上标号

image.png

1点中重新打标号89排名第一,

image.png

如果可以提供这样的能力再取每个分组内最多的前三个前几个加个条件即可,比如step小于等于3解决这类问题的核心在不同的分组内找出组内的共性,不管是111还是89一定是组内的第一名找出第一名,跟数值无关因此能够满足于在分组内进行操作,并且打标号的一系列问题,就是分组函数

2、需求描述:统计每小时各来访 host 的产生的 pvs 数最多的前 N 个(topN)。

row number() 函数

语法: row number() over (partition by XXX order by xxx) rank, rank 为分组的别名,相当于新增一个字段为 rank。在 hive 中带 over 关键字的语句叫分组函数。

3、分组函数的关键是 sql 中带有 over 语句。

over (partition by XXX order by xxx)xxx都是具体的字段

partition by 用于指定根据什幺字段迸行分組

order by 用于指定分組内根据什幺字段迸行排序(asc | desc )

排序时还可以控制排序的顺序

4、分组完之后还要结合具体的函数来表示聚合函数是输入多行输出一行的row number() 分组函数搭配over语句使用之后它可以在分好的每个组内根据排序的字段依次打上步骤号或者标号返回构成一个新的字段,这个字段可以自己重新命名

row_ number() over (partition by xxx order by xxx) 标号字段

row_ number()用于在分好的组内根据排序的字段依次不重复的打上步骤号返回构成个新的字段新目字段,就是标号字段

后续可以根据返回的步骤号进行过滤查询从而满足分组统计功能

符合需求,非常好用的row_ number()函数。

5、同样都是一为什么排第六名,排第名第八名,在生活中如果两个同学都考百分,那么谁是第一名还是并列第一名row_ number() 它是完全没有考虑数据的重复性它不管怎么排序只会依次打标号

image.png

6、比如有一个全班的学生表,根据性别进行分组,一个班的同学就会男的一组女的在每个分组内再根据年龄进行排序,男的排序,女的排序控制正序道序,依次给每个成绩打上步骤号就可以过滤

(1)partition by 用于分组,比方依照 sex 字段分组

(2)order by 用于分组内排序,比方依照 sex 分组后,组内按照 age 排序。

(3)排好序之后,为每个分组内每一 条分组记录从1开始返回-一个数字

(4)取组内某个数据,可以使用 where 表名. rank>x 之类的语法去取。

以下语句对每个小时内的来访 host 次数倒序排序标号:

select ref host, ref host cnts, concat (month. dav, hour),

Row_number ()

Over(partition byconcat (month, day, hour)orderby

ref host cnts desc) as od from dw pVS refererhost everyhour;
分组函数应用到数据重点要确定根据谁分组,根据谁排序要统计每个小时内最多的前n个,所以分组应该跟 hour 相关,零点一组一点一组partition by 确定的是hour字段每个小时内分组内根据来访的pv倒序排序,partition by 时间order by 倒序讲义中使用了 concat 拼接函数把三个字段进行拼接排序month, day, hour本意上要根据小时 hour 进行排序,但是数据中根据 month, day, hour 进行排序,如果一天当中数据干净month, day 没有任何意义,不管是零点钟还是一点钟还是两点钟都来自月同一天,分区函数分区统计一样,只要保证分区中数据是干净的,都是十一月同一天后面字段才会起决定作用,所以真正起决定作用是 hour分组完根据来访的pvs倒序进行排序,返回构成一个新的字段 od

7、复制在 hive 中执行sql 执行比较慢,服务器把 sql 编译成 map 和样本执行为了它在小数据的情况下本地执行快,建议打开智能本地模式,命令在参考资料中,打开参考资料点击数据入库

image.png

点击 ods-data-import.sql里面有设置 hive 执行的模式自动本地当满足条件的时候可以切换本地set hive . exec . mode . local . auto=true;

image.png

复制参数在 hive 终端进行执行查看刚才的结果进行设置方便后面的计算。可以看到数据比较明显数据中有一些人为的变成了2第一名89,再想取 top3加 where od 小于等于3,od出来的数只有321三个数想统计来坊最少的前三个很简单,把正序反过来pvs 倒序排序,按照正序排序前几个又变成相反的过程所以理解它的本质和精髓非常的重要,这就是分组函数

8、打开参考资料,在数据分析中分组 topn 统计脚本。创建临时表,把结果保存出来,临时表叫 pvs_refhost_topn_everyhour 每个小时 topn,当中哪个小时的第几名哪里来的pvs 多少

drop table dw_ pvs_ refhost_ topn_ everyhour ;

Create table dw_ pvs_ refhost_ topn_ everyhour (

hour string,

toporder string,

ref_ host string ,

ref_ host_ cnts string

) partitioned by (datestr string);

insert into table dw_ pvs_ refhost_ topn_ everyhour partition (datestr= '20181101')

select t.hour,t.od,t.ref_ host,t.ref_ host_ cnts from

(select ref_ host,ref_ host_ cnts , concat (month , day ,hour) as hour ,

row_ number() over (partition by concat (month , day, hour) order by ref_ host_ cnts desc) as od

from dw_ pvs_ refererhost_ everyhour) t where od<=3 ;

使用 insert 加 select 语句把数据插入到表中做了一个嵌套查询查询 pvs 表根据的时间小时进行分组,根据来访的host做倒序排序,返回构成一个新的字段 od基于表做过滤od 小于等于3,最多前三个把查询出来的结果插入到创建的临时表中核心的关键是 row_number() 分组函数复制临时表在 hive 终端执行用 insert 语句把查询结果保存在临时表中方便后面的使用因为开启本地模式所以速度会比较快输入select*from dw_ pvs_refhost_topn_

everyhour);不加 limit 直接执行可以看到每个小时的 top1-top3 来访的 hostpvs非常方便满足了业务的需求

9、针对分组函数有的资料也把它称为窗口函数窗口函数的窗口就是熟悉的windows举例画一个表操作表要么查询一行当中选取某些资料,要么是查询多行做聚合传统的操作方式是操作一行或操作多行现在不一样在操作表的同时会把数据按照某种规律进行分组,举例对数据进行分组第一组第二组第三组,第四组那分组规律可以自己控制,分完组之后在不同的组内进行操作,刚才的那些函数是作用于分组内并排在一起的框框像一个并排的窗户因此有的资料上把分组函数称之为窗口函数

image.png

10、所谓的窗口函数是形象的描述分组函数的形式,作用于段范围内的分析函数,先分组再分析。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
29天前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
305 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
15天前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
38 3
|
28天前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
160 0
|
3月前
|
jenkins 持续交付
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
|
5月前
|
关系型数据库 MySQL
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
【随手记】MySQL中ROW_NUMBER()、RANK()和DENSE_RANK()函数的用法
148 1
|
5月前
|
存储 Java 关系型数据库
基于JSP的九宫格日志网站
基于JSP的九宫格日志网站
|
5月前
|
JSON 中间件 数据格式
Gin框架学习笔记(六)——gin中的日志使用
Gin框架学习笔记(六)——gin中的日志使用
160 0
|
6月前
|
安全 Linux 调度
【后台开发】TinyWebser学习笔记(4)定时器、日志系统(单例模式)、封装互斥锁信号量
【后台开发】TinyWebser学习笔记(4)定时器、日志系统(单例模式)、封装互斥锁信号量
37 1
|
4天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
88 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
189 3
下一篇
无影云桌面