如何获取翻滚window的开始和结束时间?

How to get the start and end time of a tumbling window?

我得到一个包含 CreatedOn 和 UpdatedOn 时间字段的数据流。 我需要计算 1 小时内 TumblingWindow 的创建记录和更新记录数。

如何将 CreatedOn 筛选为介于 TumblingWindow 开始和结束时间之间?

编辑了下面的评论

我将做出以下假设:

  • 如果在您的上游系统中创建了一行,您将获得一条具有相同 CreatedOn 和 UpdatedOn 时间戳的记录
  • 如果在您的上游系统中更新了一行,您会得到一条 UpdatedOn 与 CreatedOn 不同的记录

假设您的输入记录如下:

{"rowId" : 123, "CreatedOn": "2022-01-01 00:00:00", "UpdatedOn": null }
{"rowId" : 123, "CreatedOn": "2022-01-01 00:00:00", "UpdatedOn": "2022-01-01 01:10:00"}

通过以下查询,您可以获得每小时 created/updated 行的计数:

SELECT
    DATEADD(hour,-1,System.Timestamp()) AS WindowStart,
    System.Timestamp() AS WindowEnd,
    SUM(CASE WHEN CreatedOn = UpdatedOn THEN 1 ELSE 0 END) AS CreatedCount,
    SUM(CASE WHEN CreatedOn != UpdatedOn THEN 1 ELSE 0 END) AS UpdatedCount
FROM input1
GROUP BY
    Tumbling(hour,1)

这里给你:

WindowStart WindowEnd CreatedCount UpdatedCount
2022-04-01T10:00:00 2022-04-01T11:00:00 1 1

注意这里的 windowing 是如何在挂钟时间完成的(实时服务的到达时间,或者当我在 VS Code 中执行本地 运行 时在这里查询开始时间),所以我的 2 个操作被重新组合在一个 window 上。 运行ning live的时候,如果你在操作时间和ASA收到行(到达时间)之间没有太多延迟,他们肯定会在不同的时间windows。

如果你想在操作时间上强制执行时间进程,你可以使用 TIMESTAMP BY 子句:

SELECT
    DATEADD(hour,-1,System.Timestamp()) AS WindowStart,
    System.Timestamp() AS WindowEnd,
    SUM(CASE WHEN CreatedOn = UpdatedOn THEN 1 ELSE 0 END) AS CreatedCount,
    SUM(CASE WHEN CreatedOn != UpdatedOn THEN 1 ELSE 0 END) AS UpdatedCount
FROM input1 TIMESTAMP BY COALESCE(UpdatedOn, CreatedOn)
GROUP BY
    Tumbling(hour,1)

现在输出变成:

WindowStart WindowEnd CreatedCount UpdatedCount
2021-12-31T23:00:00 2022-01-01T00:00:00 1 0
2022-01-01T01:00:00 2022-01-01T02:00:00 0 1