Flink: вычислять только в конце окна сеанса - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть AggregateFunction , которая вычисляет среднее значение по последовательности событий в WindowedStream .
Предостережение заключается в том, что среднее необходимо вычислять по парам событий, которыеможет прибыть из строя (или вообще не быть).

Другими словами, мне нужно отсортировать данные перед вычислением, потому что последовательность важна.

Я могу сделать это с помощью getResult API, но эта функциявызывается для каждого события в окне, что не имеет смысла в производительности.Я мог бы также сделать это с flink-cep , но я бы хотел избежать этого по той же причине.

В идеале, я хотел бы вычислять среднее значение только в самом конце(где я могу отсортировать данные один раз), когда окно закрыто.

Есть ли какой-нибудь обработчик для этого?Самым близким, что я нашел, было триггеров , но нет способа закрытия окна.

Спасибо

Редактировать:
В итоге я использовал ProcessWindowFunction с инкрементальной агрегацией

ProcessWindowFunction можно комбинировать с ReduceFunction, AggregateFunction или FoldFunction для постепенного агрегирования элементов по мере их поступления вокно.Когда окно закрыто, ProcessWindowFunction получит агрегированный результат.Это позволяет ему постепенно вычислять окна, имея доступ к дополнительной метаинформации окна ProcessWindowFunction.

1 Ответ

0 голосов
/ 06 февраля 2019

Вместо AggregateFunction вы можете использовать ProcessWindowFunction без инкрементного агрегирования.Эта функция будет вызываться при запуске окна, и ей будет передан Iterable, содержащий содержимое окна, и Collector, который вы можете использовать для выдачи результатов.

Когда вызывается функция ProcessWindowFunction, вы можете отсортировать содержимое и произвести любой вывод.

...