【问题标题】:KSQL Hopping Window : any way to get only one record in response?KSQL Hopping Window:有什么方法可以只获得一条记录作为响应?
【发布时间】:2020-08-28 20:46:02
【问题描述】:

我们正在使用 KSQL 对实时数据执行一些聚合/过滤。 我们的一个用例是,我们需要在特定活动的最后 N 天执行一些操作,这将是连续操作。 所以这需要跳窗。

当我尝试查询时,跳跃持续时间为 M 天,KSQL 查询返回 M 记录而不是 1(这是希望的)。

查询:

select PROTO, 
       TIMESTAMPTOSTRING(WindowStart(), 'yyyy-MM-dd''T''HH:mm:ss''Z''', 'UTC') as "timestamp", 
       TIMESTAMPTOSTRING(WindowEnd(), 'yyyy-MM-dd''T''HH:mm:ss''Z''', 'UTC'), 
       COUNT(PROTO) AS Count 
  FROM DATASTREAM  
         WINDOW HOPPING (SIZE 5 DAYS, ADVANCE BY 1 DAY) 
 WHERE MSG like '%SOMESTRING%' 
   AND SPLIT(PROTO, '/')[0] = 'tcp' 
 GROUP BY PROTO; 

tcp/22 | 2020-01-27T00:00:00Z | 2020-02-01T00:00:00Z | 1
tcp/22 | 2020-01-28T00:00:00Z | 2020-02-02T00:00:00Z | 1
tcp/22 | 2020-01-29T00:00:00Z | 2020-02-03T00:00:00Z | 1
tcp/22 | 2020-01-30T00:00:00Z | 2020-02-04T00:00:00Z | 1
tcp/22 | 2020-01-31T00:00:00Z | 2020-02-05T00:00:00Z | 1

有没有办法只获取第一条记录,或者结束时间


请考虑以下数据记录。


{ "time": "2020-01-25 23:36:37 UTC", "msg": "Error"} 
{ "time": "2020-01-25 23:36:38 UTC", "msg": "Error"} 
{ "time": "2020-01-25 23:36:40 UTC", "msg": "Error"} 
{ "time": "2020-01-26 23:36:37 UTC", "msg": "Error"} 
{ "time": "2020-01-26 23:36:38 UTC", "msg": "Error"} 
{ "time": "2020-01-26 23:36:39 UTC", "msg": "Error"} 
{ "time": "2020-01-26 23:36:40 UTC", "msg": "Error"} 
{ "time": "2020-01-27 23:36:37 UTC", "msg": "Error"} 
{ "time": "2020-01-27 23:36:38 UTC", "msg": "Error"} 
{ "time": "2020-01-27 23:36:39 UTC", "msg": "Error"} 
{ "time": "2020-01-28 23:36:37 UTC", "msg": "Error"} 
{ "time": "2020-01-28 23:36:38 UTC", "msg": "Error"} 
{ "time": "2020-01-29 23:36:37 UTC", "msg": "Error"} 
{ "time": "2020-01-29 23:36:38 UTC", "msg": "Error"} 
{ "time": "2020-01-29 23:36:39 UTC", "msg": "Error"} 
{ "time": "2020-01-29 23:36:40 UTC", "msg": "Error"} 

我正在查找过去 2 天 msgError 的记录数。

如果我在 25 日 23:36:37 触发 KSQL 查询,我会期望结果为:

2020-01-25T23:36:37Z | 1
2020-01-25T23:36:38Z | 2
2020-01-25T23:36:40Z | 3

2020-01-26T23:36:37Z | 4
2020-01-26T23:36:38Z | 5
2020-01-26T23:36:39Z | 6
2020-01-26T23:36:40Z | 7

2020-01-27T23:36:37Z | 5
2020-01-27T23:36:38Z | 6
2020-01-27T23:36:39Z | 7

2020-01-28T23:36:37Z | 4
2020-01-28T23:36:38Z | 5

2020-01-29T23:36:37Z | 3
2020-01-29T23:36:38Z | 4
2020-01-29T23:36:39Z | 5
2020-01-29T23:36:40Z | 6

【问题讨论】:

标签: ksqldb


【解决方案1】:

如果您想要一个为期五天的窗口,我认为您需要一个 TUMBLING 窗口。相反,您获得了五个窗口,因为您使用了 HOPPING 并提前了 1 DAY - 请参阅每天的 WINDOWSTART() 更改。

参考文献:

【讨论】:

  • 好的,明白它为什么会这样。但我也不能使用翻滚窗口,在这种情况下窗口不会重叠,对吧?用例是连续获取最后 N 天的数据,Agg。 1 月 1 日至 2 月 1 日、1 月 2 日至 2 月 2 日的数据(一个数据点),依此类推。如果我没有得到任何其他解决方案,我在想,可能只是运行一次翻滚查询,杀死它,第二天再做一次?
  • 当接收到滚动窗口的数据时,聚合更新并重新发送。也许我不完全理解你的问题。你能用一组输入记录和你想要的输出来更新它吗?
  • 同意,但是在翻滚窗口中,计数器将在窗口结束后初始化。它不会跟踪部分窗口。抱歉不清楚,我已经用示例更新了问题。如果我需要添加任何信息,请告诉我。
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多