Окно Apache Beam: учитывайте поздние данные, но выделяйте только одну панель

Я хотел бы создать одну панель, когда водяной знак достигнет x минут после конца окна. Это позволило мне убедиться, что я обрабатываю некоторые поздние данные, но по-прежнему генерирую только одну панель. Сейчас я работаю в java.

На данный момент я не могу найти правильных решений этой проблемы. Я мог бы создать одну панель, когда водяной знак достигнет конца окна, но тогда все запаздывающие данные будут отброшены. Я мог бы генерировать панель в конце окна, а затем снова, когда я получаю поздние данные, однако в этом случае я не генерирую одну панель.

В настоящее время у меня есть код, похожий на этот:

.triggering(
    // This is going to emit the pane, but I don't want emit the pane yet!                                  
    AfterWatermark.pastEndOfWindow()

    // This is going to emit panes each time I receive late data, however 
    // I would like to only emit one pane at the end of the allowedLateness
).withAllowedLateness(allowedLateness).accumulatingFiredPanes())

Если все еще есть путаница, я хотел бы выделять только одну панель, когда водяной знак проходит allowedLateness.


person Joe Stoker    schedule 02.05.2019    source источник


Ответы (2)


Спасибо, Гиллем, в конце концов я использовал ваш ответ, чтобы найти этот очень полезная ссылка с множеством примеров лучей apache. Из этого я пришел к следующему решению:

 // We first specify to never emit any panes
 .triggering(Never.ever())

 // We then specify to fire always when closing the window. This will emit a
 // single final pane at the end of allowedLateness
 .withAllowedLateness(allowedLateness, Window.ClosingBehavior.FIRE_ALWAYS)
 .discardingFiredPanes())
person Joe Stoker    schedule 03.05.2019
comment
Круто, я не знал, что ты можешь использовать Never.ever(). Тогда это еще проще! - person Guillem Xercavins; 03.05.2019
comment
Я думаю, что панель вовремя все равно будет производиться. Вам по-прежнему нужен фильтр, чтобы определить, является ли это последней панелью. - person Kenn Knowles; 30.10.2019

Я бы сначала установил _ 1_ на FIRE_ALWAYS. Таким образом, когда окно окончательно закрыто, оно отправит последнюю панель (даже если нет поздних записей с последней панели) с _ 3_ установлен на true.

Тогда я бы выбрал второй вариант:

Я мог бы генерировать панель в конце окна, а затем снова, когда я получаю поздние данные, однако в этом случае я не генерирую одну панель.

Но отбрасывая нижестоящие панели, которые не являются окончательными, с чем-то вроде:

public void processElement(ProcessContext c) {
    if (c.pane().isLast) {
        c.output(c.element());
    }
}
person Guillem Xercavins    schedule 02.05.2019
comment
Спасибо, Гиллем, это очень интересное решение, и я уверен, что буду использовать его в будущем. Используя ваш ответ для поиска решений, связанных с Window.ClosingBehavior, я нашел решение, которое я опубликовал. Спасибо! - person Joe Stoker; 03.05.2019