zoukankan      html  css  js  c++  java
  • 理解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后的所有行进行开窗分组后, 按行组聚合
  • 相关阅读:
    OpenCV基本函数学习
    OpenCV:概述、结构和内容
    NS2典型例子简单分析
    NS2仿真过程中需要的语言及基本组件
    洛谷 P2393 yyy loves Maths II
    洛谷 P1922 女仆咖啡厅桌游吧
    洛谷 P2559 [AHOI2002]哈利·波特与魔法石
    洛谷 P1301 魔鬼之城
    洛谷 P2383 狗哥玩木棒
    洛谷 P2298 Mzc和男家丁的游戏
  • 原文地址:https://www.cnblogs.com/bitbitbyte/p/13192606.html
Copyright © 2011-2022 走看看