理解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后的所有行進行開窗分組后, 按行組聚合


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM