Azure 流分析:使 TUMBLINGWINDOW 函数开始日期为每个 window 的开始日期和每个 window 的结束日期不包括

Azure Stream Analytics: Making the TUMBLINGWINDOW function start date of each window inclusive and end date of each window exclusive

上下文

我有一个关于 azure 流分析(它使用 T-SQL 之类的语言)的问题,特别是在 TUMBLING WINDOW 函数的参数中使用偏移参数。基本上,我正在尝试使用偏移量参数来使 window 间隔的开始时间包含在内,并且结束 window 时间不包含在内(这与默认行为相反)。

这里是参考文档: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))

在这里,我刚刚采用了文档中的示例,并将时间 window 持续时间更改为我想要的持续时间,同时保留偏移量不变。不确定这是否正确(似乎不正确)但不完全确定如何使用偏移量使 window 在开头包含 window 并在结尾包含独占,就像它在文档中提到的那样例如。

首先让我们提一下编写带有时间元素的查询时的两个好的做法:

  • 如果您是 developing locally in VS Code, please use TIMESTAMP BY,或者整个文件将在单个时间戳(查询开始时间)上加载,这将使所有时间逻辑都没有实际意义。如果您没有事件时间戳,或者不想使用负载中的时间戳,您始终可以使用 TIMESTAMP BY EventEnqueuedUtcTime(您需要将其添加到本地数据样本),这是默认的隐式行为无论如何在事件中心
  • 在您的查询中,通过选择 WindowStart 和 WindowEnd 使 window 边界可见,如下所示:
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 分钟的翻滚 window 上计算这些记录,看看它们是如何根据偏移量落入和落出的。

这是默认行为:

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))

这给了我:

WindowStart WindowEnd 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 上并被推入前一个 window。

然后使用偏移量:

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))

我们有:

WindowStart WindowEnd 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 现在是第一个 window 的一部分,而 3 和 4 是第二个的一部分。

但还要注意我们如何没有让之前的 windows 在其范围内切换行为(从包含到排除,反之亦然),我们只是将球门柱移动了一个 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

但只要您能找到一个小到足以被您的用例视为可以忽略不计的偏移量,您就很好。我们有微秒,所以我猜应该没问题 ;)