Hive 窗口函數LEAD LAG FIRST_VALUE LAST_VALUE


窗口函數(window functions)對多行進行操作,並為查詢中的每一行返回一個值。 OVER()子句能將窗口函數與其他分析函數(analytical functions)和報告函數(reporting functions)區分開來。

1. 常用窗口函數

下表列出了一些窗口函數以及描述信息:

窗口函數 描述
LAG() LAG()窗口函數返回分區中當前行之前行(可以指定第幾行)的值。 如果沒有行,則返回null。
LEAD() LEAD()窗口函數返回分區中當前行后面行(可以指定第幾行)的值。 如果沒有行,則返回null。
FIRST_VALUE FIRST_VALUE窗口函數返回相對於窗口中第一行的指定列的值。
LAST_VALUE LAST_VALUE窗口函數返回相對於窗口中最后一行的指定列的值。
2. 語法

LAG 和 LEAD 語法

LAG | LEAD
( <col>, <line_num>, <DEFAULT> )
OVER ( [ PARTITION BY ] [ ORDER BY ] )

FIRST_VALUE | LAST_VALUE 語法

FIRST_VALUE | LAST_VALUE
( <col>,<ignore nulls as boolean> ) OVER
( [ PARTITION BY ] [ ORDER BY ][ window_clause ] )

3.demo

原數據:

hive> select * from tmp_pv;
OK
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-11    5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-12    7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-13    3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-14    2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-15    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-16    4
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-10    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-11    9
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-12    3
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-13    10
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-14    1
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-15    8
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-16    2
Time taken: 0.102 seconds, Fetched: 14 row(s)

3.1 LAG()

LAG(col,n,DEFAULT)窗口函數返回分區中當前行之前第n行對應列的值。 如果沒有相應的行,則返回NULL。 第一個參數為列名,第二個參數為當前行之前第n行(可選,默認為1),第三個參數為缺失時默認值(當前行之前第n行為NULL沒有時,返回該默認值,如不指定,則為NULL)。

為了比較每個用戶瀏覽次數與前一天的瀏覽次數進行比較,查詢返回當前瀏覽次數以及前一天的瀏覽數量。由於在2017-02-10之前沒有瀏覽行為,前一天的瀏覽次數設置為0(不設置默認為NULL)。

hive> select gid, dt, pv, lag(pv, 1, 0) over (partition by gid order by dt) as pre_pv from tmp_pv;
 
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    0
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-11    5    1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-12    7    5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-13    3    7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-14    2    3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-15    4    2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-16    4    4
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-10    2    0
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-11    9    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-12    3    9
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-13    10    3
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-14    1    10
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-15    8    1
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-16    2    8
Time taken: 11.783 seconds, Fetched: 14 row(s)

3.2 LEAD()

LEAD(col,n,DEFAULT)窗口函數返回分區中當前行后面第n行對應列的值。 如果沒有相應的行,則返回NULL。 第一個參數為列名,第二個參數為當前行后面第n行(可選,默認為1),第三個參數為缺失時默認值(當前行后面第n行為沒有時,返回該默認值,如不指定,則為NULL)。

為了比較每個用戶瀏覽次數與后一天的瀏覽次數進行比較,查詢返回當前瀏覽次數以及后一天的瀏覽數量。由於在2017-02-16之后沒有瀏覽行為,后一天的瀏覽次數顯示為NULL(默認為NULL)

hive> select gid, dt, pv, lead(pv, 1) over (partition by gid order by dt) from tmp_pv;
 
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    5
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-11    5    7
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-12    7    3
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-13    3    2
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-14    2    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-15    4    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-16    4    NULL
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-10    2    9
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-11    9    3
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-12    3    10
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-13    10    1
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-14    1    8
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-15    8    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-16    2    NULL
Time taken: 9.509 seconds, Fetched: 14 row(s)

 

3.3 FIRST_VALUE()

為了比較每個用戶瀏覽次數與第一天瀏覽次數進行比較,查詢返回當前瀏覽次數以及第一天瀏覽次數。第一個用戶第一天瀏覽次數為1,第二個用戶第一天瀏覽次數為2。

hive> select gid, dt, pv, first_value(pv) over (partition by gid order by dt) from tmp_pv;
 
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-11    5     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-12    7     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-13    3     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-14    2     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-15    4     1
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-16    4     1
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-10    2     2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-11    9     2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-12    3     2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-13    10    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-14    1     2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-15    8     2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-16    2     2
Time taken: 9.862 seconds, Fetched: 14 row(s) 

備注

上面例子窗口為第一行到當前行(缺失window子句有order by ,默認為rows between unbounded preceding and current row)。所以,first_value返回窗口的第一行,即第一天瀏覽次數。

4.4 LAST_VALUE()

為了比較每個用戶瀏覽次數與最新一天瀏覽次數進行比較,查詢返回當前瀏覽次數以及最新一天瀏覽次數。第一個用戶最新一天(2017-02-16)瀏覽次數為4,第二個用戶最新一天(2017-02-16)瀏覽次數為2。

hive> select gid, dt, pv, last_value(pv) over (partition by gid order by dt rows between current row and unbounded following) from tmp_pv;
 
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-10    1    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-11    5    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-12    7    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-13    3    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-14    2    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-15    4    4
0006D2BC-4DF9-4C0B-83AD-0183789E78D4    2017-02-16    4    4
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-10    2    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-11    9    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-12    3    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-13    10    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-14    1    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-15    8    2
993BD7AD-3B62-BA0C-15AE-A14B85921889    2017-02-16    2    2
Time taken: 9.335 seconds, Fetched: 14 row(s)

備注

上面例子的窗口為當前行到最后一行(rows between current row and unbounded following)。last_value返回的是窗口最后一行,即最新一天的瀏覽次數。


免責聲明!

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



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