如何获取翻滚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
我得到一个包含 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 |