理解hive中的开窗函数
开窗函数简单介绍
与聚合函数一样,开窗函数也是需要对行进行分组, 然后使用聚合算子. 可是它不像普通聚合函数那样每组只返回一个值,而是每一行返回一个窗口的聚合结果.
举例说明
数据如下
hive (default)> select * from over_test;
open_test.name open_test.orderdate open_test.cost
jack 2017-04-06 42
mart 2017-04-08 62
mart 2017-04-09 68
mart 2017-04-11 75
mart 2017-04-13 94
over()
表示: 窗口没有分组, 所有行在同一个行组中, 该行组一共5行. 每行都有一个开窗聚合结果, 聚合结果是5.
hive (default)> select name, count(*) over() from over_test;
name count_window_0
jack 5
mart 5
mart 5
mart 5
mart 5
over(partition by name)
表示: 窗口中的行组是以name字段进行分组的. 每行通过name字段对应相应的行组, 并其每行获得一个该行组的聚合后的返回值, 这里有5行每行都有一个返回值.
jack所在行对应窗口中行组的行数是1, mart所在行对应窗口中行组的行数是4.
hive (default)> select name, count(*) over(partition by name ) from over_test;
name count_window_0
jack 1
mart 4
mart 4
mart 4
mart 4
group by
结合 over()
group by
的优先级高于开窗, 先group by name
生成两行, 然后对每一行进行开窗聚合.
over()
对所有行进行开窗聚合
hive (default)> select name, count() over() from over_test group by name; name count_window_0 jack 2 mart 2
over(partition by name)
根据字段name开窗聚合
hive (default)> select name, count() over(partition by name) from over_test group by name; name count_window_0 jack 1 mart 1
开窗聚合过程总结
有多少行就有多少个开窗聚合结果.
over(partion by field1, field2)
根据字段对所有行进行分组, 然后对每一行选择一个行组进行聚合一个聚合结果```over()
, 将所有行分为一个行组, 对每一行选择该行组进行聚合得到一个结果- 如果有
group by
则先进行group by
, 再对group by
后的所有行进行开窗分组后, 按行组聚合