在WindowAssigner
中,元素被分配給一個或多個TimeWindow
實例。在滑動事件時間窗口的情況下,這發生在SlidingEventTimeWindows#assignWindows
。Apache Flink:窗口函數和時間開始
在具有size=5
和slide=1
,與timestamp=0
的元素被分配到下面的窗口的窗口的情況下:
- 窗口(開始= 0,結束= 5)
- 窗口(開始= -1 ,端= 4)
- 窗口(開始= -2,端= 3)
- 窗口(開始= -3,端= 2)
- 窗口(開始= -4,端= 1)
在一個畫面:
+-> Beginning of time
|
|
+----------------------------------------------+
| size = 5 +--+ element |
| slide = 1 | |
| v |
| t=[ 0,5[ Window 1 XXXXX |
| t=[-1,4[ Window 2 XXXXX |
| t=[-2,3[ Window 3 XXXXX |
| t=[-3,2[ Window 4 XXXXX |
| t=[-4,1[ Window 5 XXXXX |
| |
| time(-4 to +4) ---- |
| 4321|
+---------------------------+------------------+
|
|
|
+
有沒有辦法告訴弗林克,有時間的開始和以前一樣,有沒有窗戶?如果沒有,從哪裏開始尋找改變?在上述情況下,Flink應該只有一個窗口(t=[4,8[ Window 1
)作爲第一個元素。像這樣:
+-> Beginning of time
|
|
+-----------------------------------------------+
| size = 5 +--+ element |
| slide = 1 | |
| v |
| t=[ 0,5[ Window 1 XXXXX |
| t=[ 1,6[ Window 2 XXXXX |
| t=[ 2,7[ Window 3 XXXXX |
| t=[ 3,8[ Window 4 XXXXX |
| t=[ 4,9[ Window 5 XXXXX |
| |
| time(-4 to +8) ---- |
| 4321|
+---------------------------+-------------------+
|
|
|
+
一旦窗口數量達到並超過窗口大小,這將不再有效果。然後,在上述情況下,所有元素都在5個窗口內。
腳註:
org.apache.flink.streaming.api.windowing.assigners.SlidingEventTimeWindows#assignWindows
這適用於現在作爲「解決方法」。我猜它不是那麼受歡迎的請求:) –
即使作爲解決方法,此解決方案也可能不起作用,因爲您可能需要從流中讀取「startTime」(如果是事件時間)。而且似乎沒有簡單的方法可以在你自己的'WindowAssigner'中實現這一點,因爲沒有簡單的方法(或者我沒有找到任何方法)來存儲讀取的第一個元素的時間,這對分配器來說是可訪問的。 – cvb