當我在hive中使用RANGE來指定視窗時,我得到了一些混亂的結果。
這里有一個測驗表。
select
id,
val,
sum(val) over(order by val rows between unbounded preceding and
current row) rows_sum,
sum(val) over(order by val range between unbounded preceding and
current row) range_sum
from test
這是上述查詢的結果。這也是我期待的結果
。| id | val | rows_sum | range_sum
|---|---|---|
| 1 | 1 |
但是對于range_sum欄位,如果我把順序規則從asc改為desc。
sum(val) over(order by val desc range between unbounded preceding and
current row) range_sum
這里是結果
但是我期待的range_sum的結果是
| val | range_sum |
|---|---|
| 6 | 18 |
在Hive中有兩種定義框架的方法,即ROWS和RANGE。例如,SUM(val) RANGE BETWEEN 100 PRECEDING AND 200 FOLLOWING根據與當前行的值的距離來選擇行。比如說當前的val是200,這個框架將包括val值范圍在100到400之間的行
所以在我上面的例子中,我選擇的是與當前行的值有距離的行。
所以在我上面的例子中:無界的前行和當前行之間的范圍
當值為6時,該框架包括3條值=6的行,所以總和為18。但是當我們考慮第4行時,它的值是3。因為排序規則是desc,無界前行的值是6,而當前行是3。框架應該包括值在6和3之間的行,而沒有行滿足這個條件。
uj5u.com熱心網友回復:
它按設計作業,根據標準,同樣的行為在其他資料庫中也是如此。
比起標準檔案(for free),更容易找到Hive和其他資料庫如Oracle的規范。例如參見"HQL中的視窗規范"和Oracle"視窗函式框架規范"
。首先對磁區進行排序,然后計算邊界,并使用邊界之間的框架。框架是根據ORDER BY取的,并不總是>=bound1和<=bound2。
對于order by DESC Bound1>=Row.value>=Bound2。框架包括從磁區開始到當前行的行,包括當前行的所有對等行(根據ORDER BY子句等于當前行的行)。
對于按ASC排序Bound1<=Row.value<=Bound2。
無界前序:
系結(bound1) 是第一個partition row (according to the order) 。
當前行:
對于 ROWS,系結(bound2)是的current行。For RANGE, 系結的是同行的current row (rows with the same value as current row)。)
還可以閱讀這個來自Sybase的精彩解釋:
。ORDER BY值的排序順序是測驗的一個關鍵部分。 的關鍵部分;數字值本身并不能確定是否被排除在外在基于值的框架中,ORDER BY 值的排序順序是測驗的關鍵部分。 并不能決定排除或納入
。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318972.html
標籤:
