K SQL Hopping Window: есть ли способ получить только одну запись в ответ? - PullRequest
0 голосов
/ 03 февраля 2020

Мы используем K SQL для выполнения некоторых агрегаций / фильтрации данных в реальном времени. Один из вариантов использования, который у нас есть, заключается в том, что нам нужно выполнить некоторую операцию в последние N дней определенного действия, это будет непрерывная операция. Так что это должно быть окно с перескоком.

Когда я попробовал запрос с длительностью перескоков, равной M дням, запрос K SQL возвратил 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

Есть ли способ получить только первую запись или записи, для которых время окончания <= текущее время или любой другой обходной путь для получения 1 результата на окно? </p>


Пожалуйста, рассмотрите записи данных ниже.


{ "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"} 

Я ищу количество записей, у которых msg как Ошибка за последние 2 дня.

Если я уволю K SQL запрос 25-го числа в 23:36:37, я ожидал бы результат как:

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

1 Ответ

0 голосов
/ 03 февраля 2020

Я думаю, что вам нужно окно TUMBLING, если вы хотите одно окно на пятидневный период. Вместо этого вы получаете пять windows, потому что вы использовали HOPPING с авансом 1 DAY - см. WINDOWSTART() изменения в день.

Ссылки:

...