- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
Hive的聚合函数衍生的窗口函数在我们进行数据处理和数据分析过程中起到了很大的作用 。
在Hive中,窗口函数允许你在结果集的行上进行计算,这些计算不会影响你查询的结果集的行数.
Hive提供的窗口和分析函数可以分为聚合函数类窗口函数,分组排序类窗口函数,偏移量计算类窗口函数.
本节主要介绍聚合函数类窗口函数的常见使用场景.
count() over();
sum() over();
max() over();
min() over();
avg() over();
分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)
具体解析 。
over()括号内为空时,是直接进行聚合计算.
其中partition by 列名 是按指定列进行分组,进而进行聚合计算.
最后的order by 列名 是按照指定列进行排序,进而进行聚合计算.
create table if not exists temp.user_info (
`id` bigint comment '用户id',
`client` string comment '客户端',
`gender` int comment '性别,0女1男',
`constellation` string comment '星座',
`age` int comment '年龄',
`pv` bigint comment '访问量',
`chat_num` bigint comment '聊天次数'
) comment '用户信息测试临时表'
数据预览 。
id | client | gender | constellation | age | pv | chat_num |
---|---|---|---|---|---|---|
1 | ios | 0 | 处女座 | 29 | 174 | 3 |
2 | ios | 1 | 双鱼座 | 26 | 263 | 2 |
3 | android | 1 | 双鱼座 | 35 | 232 | 39 |
4 | ios | 1 | 水瓶座 | 32 | 57 | 3 |
5 | ios | 1 | 射手座 | 33 | 67 | 6 |
6 | ios | 1 | 双子座 | 36 | 81 | 5 |
7 | ios | 1 | 狮子座 | 29 | 68 | 4 |
8 | ios | 1 | 狮子座 | 28 | 19 | 3 |
9 | ios | 0 | 射手座 | 32 | 479 | 2 |
10 | ios | 1 | 白羊座 | 26 | 255 | 36 |
over()括号内为空的计算比较简单,主要应用场景为保留数据明细的同时,增加额外的列进行数据聚合计算.
-- over()括号内为空时,是直接进行聚合计算
select id,client,gender,age,pv,sum(pv) over() as total_pv from temp.user_info where id <= 10
order by id
数据结果 。
id | client | gender | age | pv | total_pv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 1695 |
2 | ios | 1 | 26 | 263 | 1695 |
3 | android | 1 | 35 | 232 | 1695 |
4 | ios | 1 | 32 | 57 | 1695 |
5 | ios | 1 | 33 | 67 | 1695 |
6 | ios | 1 | 36 | 81 | 1695 |
7 | ios | 1 | 29 | 68 | 1695 |
8 | ios | 1 | 28 | 19 | 1695 |
9 | ios | 0 | 32 | 479 | 1695 |
10 | ios | 1 | 26 | 255 | 1695 |
可以看到给出了数据明细,并且在每行明细后增加了累积求和值.
select id,client,gender,age,pv,count(id) over() as total_count from temp.user_info where id <= 10
order by id
数据结果 。
id | client | gender | age | pv | total_count |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 10 |
2 | ios | 1 | 26 | 263 | 10 |
3 | android | 1 | 35 | 232 | 10 |
4 | ios | 1 | 32 | 57 | 10 |
5 | ios | 1 | 33 | 67 | 10 |
6 | ios | 1 | 36 | 81 | 10 |
7 | ios | 1 | 29 | 68 | 10 |
8 | ios | 1 | 28 | 19 | 10 |
9 | ios | 0 | 32 | 479 | 10 |
10 | ios | 1 | 26 | 255 | 10 |
给出了数据明细,并且在明细后增加了当前总用户数.
-- max()查询用户最大访问量及用户明细
select id,client,gender,age,pv,max(pv) over() as max_pv from temp.user_info where id <= 10
order by id
数据结果 。
id | client | gender | age | pv | max_pv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 479 |
2 | ios | 1 | 26 | 263 | 479 |
3 | android | 1 | 35 | 232 | 479 |
4 | ios | 1 | 32 | 57 | 479 |
5 | ios | 1 | 33 | 67 | 479 |
6 | ios | 1 | 36 | 81 | 479 |
7 | ios | 1 | 29 | 68 | 479 |
8 | ios | 1 | 28 | 19 | 479 |
9 | ios | 0 | 32 | 479 | 479 |
10 | ios | 1 | 26 | 255 | 479 |
给出了数据明细,并在最后列增加了用户最大访问量数据 。
min() 同理 。
select id,client,gender,age,pv,avg(pv) over() as avg_pv from temp.user_info where id <= 10
order by id
数据结果 。
id | client | gender | age | pv | avg_pv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 169.5 |
2 | ios | 1 | 26 | 263 | 169.5 |
3 | android | 1 | 35 | 232 | 169.5 |
4 | ios | 1 | 32 | 57 | 169.5 |
5 | ios | 1 | 33 | 67 | 169.5 |
6 | ios | 1 | 36 | 81 | 169.5 |
7 | ios | 1 | 29 | 68 | 169.5 |
8 | ios | 1 | 28 | 19 | 169.5 |
9 | ios | 0 | 32 | 479 | 169.5 |
10 | ios | 1 | 26 | 255 | 169.5 |
给出了数据明细,并在最后列增加了用户平均访问量.
select *,sum(pv) over(partition by age) as total_pv from temp.user_info where id <= 10
order by age
数据结果 。
id | client | gender | age | pv | avg_pv |
---|---|---|---|---|---|
2 | ios | 1 | 26 | 263 | 518 |
10 | ios | 1 | 26 | 255 | 518 |
8 | ios | 1 | 28 | 19 | 19 |
1 | ios | 0 | 29 | 174 | 242 |
7 | ios | 1 | 29 | 68 | 242 |
4 | ios | 1 | 32 | 57 | 536 |
9 | ios | 0 | 32 | 479 | 536 |
5 | ios | 1 | 33 | 67 | 67 |
3 | android | 1 | 35 | 232 | 232 |
6 | ios | 1 | 36 | 81 | 81 |
可以看到最后的total_pv 是按照年龄段分组进行累加的 。
select id,client,gender,age,pv,count(id) over(partition by client) as count_total from temp.user_info where id <= 10
order by id
数据结果 。
id | client | gender | age | pv | count_total |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 9 |
2 | ios | 1 | 26 | 263 | 9 |
3 | android | 1 | 35 | 232 | 1 |
4 | ios | 1 | 32 | 57 | 9 |
5 | ios | 1 | 33 | 67 | 9 |
6 | ios | 1 | 36 | 81 | 9 |
7 | ios | 1 | 29 | 68 | 9 |
8 | ios | 1 | 28 | 19 | 9 |
9 | ios | 0 | 32 | 479 | 9 |
10 | ios | 1 | 26 | 255 | 9 |
可以看到最后count_total 是按client分组进行计数的 。
select id,client,gender,age,pv,max(pv) over(partition by age) as count_total from temp.user_info where id <= 10
order by age
数据结果 。
id | client | gender | age | pv | count_total |
---|---|---|---|---|---|
10 | ios | 1 | 26 | 255 | 263 |
2 | ios | 1 | 26 | 263 | 263 |
8 | ios | 1 | 28 | 19 | 19 |
7 | ios | 1 | 29 | 68 | 174 |
1 | ios | 0 | 29 | 174 | 174 |
4 | ios | 1 | 32 | 57 | 479 |
9 | ios | 0 | 32 | 479 | 479 |
5 | ios | 1 | 33 | 67 | 67 |
3 | android | 1 | 35 | 232 | 232 |
6 | ios | 1 | 36 | 81 | 81 |
可以看到进行了分组求最大值.
min以及avg同理,不再举例.
select id,client,gender,age,pv,sum(pv) over(partition by gender order by age) as total_pv from temp.user_info where id <= 10
order by gender
数据结果 。
id | client | gender | age | pv | total_pv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 174 |
9 | ios | 0 | 32 | 479 | 653 |
2 | ios | 1 | 26 | 263 | 518 |
10 | ios | 1 | 26 | 255 | 518 |
8 | ios | 1 | 28 | 19 | 537 |
7 | ios | 1 | 29 | 68 | 605 |
4 | ios | 1 | 32 | 57 | 662 |
5 | ios | 1 | 33 | 67 | 729 |
3 | android | 1 | 35 | 232 | 961 |
6 | ios | 1 | 36 | 81 | 1042 |
数据解释:可以看到上述数据,性别为女的29岁及之前年龄段访问pv为174次,女性32岁及之前年龄访问总和pv为653次.
同理男性,不同年龄段及之前年龄的累加数据如上表,且相同年龄的累加值是一致的.
select id,client,gender,age,pv,max(pv) over(partition by gender order by age) as max_pv from temp.user_info where id <= 10
order by gender
数据明细 。
id | client | gender | age | pv | max_pv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 174 |
9 | ios | 0 | 32 | 479 | 479 |
2 | ios | 1 | 26 | 263 | 263 |
10 | ios | 1 | 26 | 255 | 263 |
8 | ios | 1 | 28 | 19 | 263 |
7 | ios | 1 | 29 | 68 | 263 |
4 | ios | 1 | 32 | 57 | 263 |
5 | ios | 1 | 33 | 67 | 263 |
3 | android | 1 | 35 | 232 | 263 |
6 | ios | 1 | 36 | 81 | 263 |
可以看到男性最大访问量为263 。
min以及avg同理,不再举例.
select id,client,gender,age,pv,count(id) over(partition by gender order by age) as count_uv from temp.user_info where id <= 10
order by gender,age
数据结果 。
id | client | gender | age | pv | count_uv |
---|---|---|---|---|---|
1 | ios | 0 | 29 | 174 | 1 |
9 | ios | 0 | 32 | 479 | 2 |
2 | ios | 1 | 26 | 263 | 2 |
10 | ios | 1 | 26 | 255 | 2 |
8 | ios | 1 | 28 | 19 | 3 |
7 | ios | 1 | 29 | 68 | 4 |
4 | ios | 1 | 32 | 57 | 5 |
5 | ios | 1 | 33 | 67 | 6 |
3 | android | 1 | 35 | 232 | 7 |
6 | ios | 1 | 36 | 81 | 8 |
分组累加求和 。
综合以上内容,第一部分和第二部分可以通过聚合函数+join的形式实现,但第三部分排序累加计数,实现起来比较困难,而这部分在一些需要分组累加汇总的场景使用很方便.
下一期:hive窗口分析函数使用攻略之二-分组排序窗口函数 。
按例,欢迎点击此处关注我的个人公众号,交流更多知识.
最后此篇关于hive窗口分析函数使用详解系列一的文章就讲到这里了,如果你想了解更多关于hive窗口分析函数使用详解系列一的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!