Flink: добавить событие в конец конечного потока данных

Предполагая, что существует конечный поток данных (например, из источника базы данных) с событиями

  • a1, a2, ..., an.

Как добавить еще одно событие b в этот поток, чтобы получить

  • a1, a2, ..., an, b

(т.е. выводить добавленное событие после всех исходных событий, сохраняя исходный порядок)?

Я знаю, что все конечные потоки после всех событий выдают MAX_WATERMARK. Итак, есть ли способ «поймать» этот водяной знак и вывести после него дополнительное событие?

(К сожалению, .union() объединение исходного потока данных с другим потоком данных, состоящим из одного события (с меткой времени, установленной на Long.MaxValue), а затем сортировка объединенного потока с использованием этот ответ не сработал.)


person trolley813    schedule 14.02.2019    source источник
comment
Вы знаете счет заранее? Кроме того, если это конечный набор, почему вы не можете использовать DataSet API вместо DataStream?   -  person austin_ce    schedule 14.02.2019


Ответы (2)


Возможно, мне что-то не хватает, но похоже, что у вас может быть просто ProcessFunction с таймером времени события, установленным где-то в далеком будущем, чтобы он срабатывал только при получении MAX_WATERMARK. А затем в методе onTimer испустите это специальное событие, если currentWatermark - MAX_WATERMARK.

person David Anderson    schedule 14.02.2019
comment
Спасибо! У меня это сработало. Я не знал, что onTimer срабатывает только при появлении водяного знака. - person trolley813; 15.02.2019

Другой подход может заключаться в том, чтобы «обернуть» исходный источник данных в другой источник данных, который испускает последний элемент, когда возвращается метод run() объекта делегата. Конечно, вам нужно быть осторожным, вызывая все методы делегата.

person kkrugler    schedule 14.02.2019