网站流量日志分析--统计分析--分组 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、所谓的窗口函数是形象的描述分组函数的形式,作用于段范围内的分析函数,先分组再分析。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
9月前
|
人工智能 运维 监控
一招高效解析 Access Log,轻松应对泼天流量
一招高效解析 Access Log,轻松应对泼天流量
164 0
一招高效解析 Access Log,轻松应对泼天流量
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
|
存储 Java 关系型数据库
基于JSP的九宫格日志网站
基于JSP的九宫格日志网站
|
监控 安全 前端开发
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
Nginx 访问日志中有 Get 别的网站的请求是什么原因?
261 0
|
存储 弹性计算 监控
日志服务SLS最佳实践:通过SLS数据加工从VPC flowlog中过滤出跨region CEN流量
本文就通过一个客户的实际案例开介绍如何使用在无法直接开启CEN flowlog的情况下,使用SLS的数据加工能力,从VPC flowlog的数据中过滤出客户需要的流量日志出来。
608 0
日志服务SLS最佳实践:通过SLS数据加工从VPC flowlog中过滤出跨region CEN流量
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
211 1
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
187 0
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
119 0
|
算法
LeetCode 414. Third Maximum Number
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
266 0
LeetCode 414. Third Maximum Number

热门文章

最新文章