KSQL Hopping Window: доступ только к самому старому подокну
Я отслеживаю скользящую сумму определенного поля с помощью запроса, который выглядит примерно так:
SELECT id, SUM(quantity) AS quantity from stream \
WINDOW HOPPING (SIZE 1 MINUTE, ADVANCE BY 10 SECONDS) \
GROUP BY id;
Теперь, по-видимому, для каждого входного тика мне возвращаются 6 различных агрегированных значений, которые относятся к следующим периодам времени:
[start, start+60] seconds
[start+10, start+60] seconds
[start+20, start+60] seconds
[start+30, start+60] seconds
[start+40, start+60] seconds
[start+50, start+60] seconds
Что, если мне интересно, это получить только результат [старт, старт +60] секунд для каждого входящего тика. Есть ли способ получить ТОЛЬКО это?
1 ответ
Поскольку вы указываете скачкообразное окно, каждая запись попадает в несколько окон, и все окна должны быть обновлены при обработке записи. Обновление только одного окна будет некорректным, а результат будет неверным.
Сравните документы Kafka Streams о скачкообразном изменении окон (Kafka Streams - это внутренний механизм времени выполнения KSQL): https://docs.confluent.io/current/streams/developer-guide/dsl-api.html
Я был в аналогичной ситуации, и создание определяемой пользователем функции для доступа только к окну с помощью collect_list(column).size() = window duration кажется многообещающим.
В udf используйте тип List, чтобы получить один из ваших сводных базовых списков значений столбцов. Затем оцените, равен ли размер сформированного списка периоду окна переключения, в противном случае верните ноль.
Из этого создайте таблицу, выбирая данные и преобразуя их с помощью udf.
Создайте таблицу из этой последней таблицы и отфильтруйте нулевые значения в преобразованном столбце.