上下文
我有一个关于 azure 流分析(使用类似 T-SQL 的语言)的问题,特别是使用 TUMBLING WINDOW 函数参数内的偏移参数。基本上,我尝试使用 offset 参数来使窗口间隔的开始时间包含在内,而结束窗口时间除外(这与默认行为相反)。
这里是引用文档:https://learn.microsoft.com/en-us/stream-analytics-query/tumbling-window-azure-stream-analytics
问题
文档提到这可以通过偏移来完成,并给出了一个示例,但并不真正理解它是如何工作的,并且希望能够将其应用到我将 TUMBLING WINDOW 间隔设置为 1 天的场景(不确定是否可以)对传递给 offset 的参数有影响)。我还没有找到任何明确的解释,所以如果有人有任何见解那就太好了。
尝试过
SELECT System.Timestamp() AS WindowEnd, TollId, COUNT(*)
FROM Input TIMESTAMP BY EntryTime
GROUP BY TollId, TumblingWindow(Duration(day, 1), Offset(millisecond, -1))
在这里,我刚刚采用了文档中的示例,并将时间窗口持续时间更改为我想要的持续时间,同时保留偏移量不变。不确定这是否正确(似乎不正确),但不完全确定如何使用偏移量使窗口包含在开始窗口中并在结束窗口中排除,就像文档示例中提到的那样。
最佳答案
首先让我们提一下使用时间元素编写查询时的两个良好实践:
- 如果您是developing locally在 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))
这给了我:
注意第一条记录如何落在 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))
我们有:
记录 1 和 2 现在是第一个窗口的一部分,记录 3 和 4 是第二个窗口的一部分。
但还要注意我们没有让之前的窗口在其边界处切换行为(从包含到排除,反之亦然),我们只是将球门柱移动了一个 epsilon 值来模拟该行为。
所以:
- 09:59:00 至 10:00:00:未收到任何事件,因此不再显示
- 10:00:00 至 10:01:00 :变为 09:59:59.999 至 10:00:59.999
- 10:01:00 至 10:02:00 :变为 10:00:59.999 至 10:01:59.999
但是只要您能找到一个足够小的偏移量,在您的用例中可以忽略不计,那么您就可以了。我们有微秒,所以我猜应该没问题;)
关于Azure 流分析 : Making the TUMBLINGWINDOW function start date of each window inclusive and end date of each window exclusive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71138874/