Flink лучший способ группировать записи по идентификатору поля

Я настраиваю Apache Flink, связанный с брокером Kafka.

Я получил следующие сообщения в случайном порядке:

  • сообщение (отметка времени = [..], индекс = 1, someData = [..])
  • сообщение (отметка времени = [..], индекс = 2, someData = [..])
  • сообщение (отметка времени = [..], индекс = 3, someData = [..])
  • сообщение (отметка времени = [..], индекс = 2, someData = [..])
  • сообщение (отметка времени = [..], индекс = 3, someData = [..])
  • сообщение (отметка времени = [..], индекс = 1, someData = [..])

В моих записях, исходящих от Кафки, есть поле index.

В моем приложении мне нужно вычислить последние две из этих записей с одинаковым идентификатором, а затем немедленно отправить ответ.

Например, эти два:

  • сообщение (отметка времени = [..], индекс = 1, someData = [..])
  • сообщение (отметка времени = [..], индекс = 1, someData = [..])

Как лучше всего хранить и вычислять две последние записи с одним и тем же индексным полем? Не могли бы вы дать мне несколько советов?


person user3361149    schedule 09.07.2019    source источник
comment
Когда вы говорите о последних двух событиях, это время события (поле отметки времени) или время обработки?   -  person Rafi Aroch    schedule 11.07.2019


Ответы (1)


Ваши требования не совсем ясны, но механизмы, которые вы, вероятно, захотите понять, используют keyBy(e -> e.index) для группировки / разделения потока по полю индекса и ключевое состояние для запоминания последнего события (или двух) для каждого значения индекса.

Если вам нужно принять во внимание временные метки, а поток событий неупорядочен даже в пределах одного значения индекса, вам нужно сначала отсортировать поток по временным меткам. В этом случае вам будет намного проще, если вы будете использовать Flink SQL для сортировки, а затем вы можете использовать match_recognize для распознавания образов, хотя это, возможно, излишне для такого простого шаблона. Вот пример того, как выполнить сортировку.

person David Anderson    schedule 09.07.2019