語境
我有一個關于天藍色流分析(使用類似 T-SQL 的語言)的問題,特別是在 TUMBLING WINDOW 函式的引數中使用 offset 引數。基本上我正在嘗試使用 offset 引數來使視窗間隔的開始時間包含在內,而結束視窗時間不包含在內(這與默認行為相反)。
這是參考檔案:https ://docs.microsoft.com/en-us/stream-analytics-query/tumbling-window-azure-stream-analytics
題
檔案提到這可以用偏移量來完成并給出了一個例子,但并不真正理解它是如何作業的,并且希望能夠將它應用到我將 TUMBLING WINDOW 間隔設為 1 天的場景中(不確定這是否會有所不同或不傳遞到偏移量的引數)。我還沒有找到任何明確的解釋,所以如果有人有任何見解,那就太好了。
試過了
SELECT System.Timestamp() AS WindowEnd, TollId, COUNT(*)
FROM Input TIMESTAMP BY EntryTime
GROUP BY TollId, TumblingWindow(Duration(day, 1), Offset(millisecond, -1))
在這里,我剛剛以檔案中的示例為例,并將時間視窗持續時間更改為我想要的持續時間,同時保持偏移量不變。不確定這是否正確(似乎不正確),但不完全確定如何使用偏移量使視窗包含在開始視窗上,并在結束時排除,就像它在檔案示例中提到的那樣。
uj5u.com熱心網友回復:
首先讓我們在撰寫帶有時間元素的查詢時提到兩個好的做法:
- 如果您在 VS Code 中進行本地開發,請使用TIMESTAMP BY,否則整個檔案將在單個時間戳(查詢開始時間)上加載,這將使所有時間邏輯沒有意義。如果您沒有事件時間戳,或者不想使用有效負載中的時間戳,則始終可以使用
TIMESTAMP BY EventEnqueuedUtcTime(您需要添加到本地資料樣本中)這是事件中心的默認隱式行為 - 在您的查詢中,通過同時選擇 WindowStart 和 WindowEnd 使視窗邊界可見,如下所示:
SELECT
--This is for a 1 minute window, adjust as necessary
DATEADD(minute,-1,System.Timestamp()) AS WindowStart,
System.Timestamp() AS WindowEnd,
...
現在我們有了它,我們可以查看偏移量語法。我認為最好的方法是通過一個示例來查看它(然后我應該將其放入檔案中......):
我的輸入檔案:
{"ReadingTimestamp":"2021-12-10T10:00:00.0000000","deviceId":1}
{"ReadingTimestamp":"2021-12-10T10:00:59.0000000","deviceId":2}
{"ReadingTimestamp":"2021-12-10T10:01:00.0000000","deviceId":3}
{"ReadingTimestamp":"2021-12-10T10:01:01.0000000","deviceId":4}
我將在 1 分鐘的滾動視窗中查看這些記錄,并查看它們如何根據偏移量進出它們。
這是默認行為:
SELECT
DATEADD(minute,-1,System.Timestamp()) AS WindowStart,
System.Timestamp() AS WindowEnd,
COUNT(*) AS C
FROM Input1 TIMESTAMP BY ReadingTimestamp
GROUP BY Tumbling(duration(minute,1))
這給了我:
| 視窗開始 | 視窗結束 | C |
|---|---|---|
| 2021-12-10T09:59:00.0000000Z | 2021-12-10T10:00:00.0000000Z | 1 |
| 2021-12-10T10:00:00.0000000Z | 2021-12-10T10:01:00.0000000Z | 2 |
| 2021-12-10T10:01:00.0000000Z | 2021-12-10T10:02:00.0000000Z | 1 |
請注意第一條記錄是如何落在 10:00:00 并被推送到前一個視窗中的。
然后使用偏移量:
SELECT
DATEADD(minute,-1,System.Timestamp()) AS WindowStart,
System.Timestamp() AS WindowEnd,
COUNT(*) AS C
INTO Output3
FROM Input1 TIMESTAMP BY ReadingTimestamp
GROUP BY Tumbling(duration(minute,1),offset(millisecond,-1))
我們有:
| 視窗開始 | 視窗結束 | C |
|---|---|---|
| 2021-12-10T09:59:59.9990000Z | 2021-12-10T10:00:59.9990000Z | 2 |
| 2021-12-10T10:00:59.9990000Z | 2021-12-10T10:01:59.9990000Z | 2 |
記錄 1 和 2 現在是第一個視窗的一部分,而 3 和 4 是第二個視窗的一部分。
But also note how we haven't made the previous windows switch the behavior at their bounds (from inclusive to exclusive and vice versa), we have simply moved the goalpost by an epsilon value to emulate the behavior.
So:
- 09:59:00 to 10:00:00 : received no events so wasn't displayed anymore
- 10:00:00 to 10:01:00 : became 09:59:59.999 to 10:00:59.999
- 10:01:00 to 10:02:00 : became 10:00:59.999 to 10:01:59.999
But as long as you can find an offset that is small enough to be considered negligible by your use case you are good. We have microsecond so I'm guessing that should work out fine ;)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431802.html
上一篇:如何將列添加到現有SQL輸出?
下一篇:上次成功付款日期
