Hive窗口函數


 

參考地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

環境准備:

CREATE TABLE `wtab`(
  `a` int, 
  `b` int, 
  `c` int);

  

數據:

 

1、LEAD函數

LEAD (scalar_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause); The LEAD function is used to return data from the next row.

lead函數主要是返回窗口中列名為:scalar_expression偏移為offset的值,如果不存在則返回NULL,窗口使用over划分,具體划分參考示例:

 SELECT a, LEAD(a,1,9999) OVER (PARTITION BY b ORDER BY C) from wtab;

PARTITION BY 表示根據字段b划分窗口,就是b值相同的划分到一個窗口,ORDER BY 表示窗口內部按照字段C進行排序。此條查詢結果為:

 

以b=1為例講解,b相同的都在一個窗口按照c排序之后結果為:

這個就是b=1的窗口,a=1下面offset=1的數據為11,所以查詢結果為:1 11 ;其他同理。

 

2、LAG函數

LAG  (scalar_expression [,offset] [,default]) OVER ([query_partition_clause] order_by_clause); The LAG function is used to access data from a previous row.

lag函數與lead函數相反,是向上offset取row,如果row不存在則返回默認值。示例:

 

 SELECT a, LAG(a, 2, 66666) OVER (PARTITION BY b ORDER BY C) from wtab;

 根據字段b划分窗口之后向上offset=2取row,沒有的話返回6666

 

 3:  FIRST_VALUE(columnName,isSkipNull) 函數

划分窗口之后,取columnName第一個值,第二個參數指定是否忽略null,默認false,示例:

SELECT a, FIRST_VALUE(a,true) OVER (PARTITION BY b ORDER BY C) from wtab;

 

查詢結果

同理LAST_VALUE取當前窗口的最后一個值!如果只是select last_value(a) from table 這種事窗口內全部元素到達之后采取;如果是 select a, last_value(a) from table這種形式是當前a的值的當前窗口取最后一個,當排序的key存在重復值的時候,取值存在不確定。例如數據為:

查詢為:

會發現b=1的窗口的last_value有點與預期不一樣,這就是由於排序的字段c存在相同的值,由於每一row到達順序不一樣導致結果存在不確定性。但是對於b=155的窗口,字段c不存在重復值,這樣就不會存在不確定性!!!!first_value同理,當半路來一個更小的值可能就存在不確定性,

因此:first_value與last_value不要和函數內部使用的字段聯合查詢:例如select last_value(a),a 這種就是聯合查詢了,函數內部字段a,外面還有字段a,此時窗口是根據當前字段a的值確定的當前窗口取first或者last.

 

3:

  • COUNT
  • SUM
  • MIN
  • MAX
  • AVG

這幾個函數就是窗口內的聚集函數,沒有特別之處,partition by 可以按照多個字段划分窗口

 

 

 

 

 

 

 

 待補充:https://blog.csdn.net/qq_20641565/article/details/52841345

 

 

 


免責聲明!

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



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