Как получить последнее значение в пределах временного окна - PullRequest
0 голосов
/ 28 сентября 2018

Вот как выглядят мои потоковые данные:

time | id | group
---- | ---| ---
1    | a1 | b1
2    | a1 | b2
3    | a1 | b3
4    | a2 | b3

Рассмотрим все примеры выше в нашем окне.Мой вариант использования получает последний отдельный идентификатор.

Мне нужно, чтобы вывод был таким, как показано ниже:

time | id | group
---- | ---| ---
3    | a1 | b3
4    | a2 | b3

Как мне добиться этого во Flink?

Я в курсеоконной функции WindowFunction.Тем не менее, я не могу обернуться, делая это.

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

class DistinctGrid extends WindowFunction[UserMessage, String, Tuple, TimeWindow] {
  override def apply(key: Tuple, window: TimeWindow, input: Iterable[UserMessage], out: Collector[String]): Unit = {
    val distinctGeo = input.map(_.id).toSet
    for (i <- distinctGeo) {
      out.collect(i)
    }
  }
}

1 Ответ

0 голосов
/ 28 сентября 2018

Если вы вводите поток с помощью поля id, вам не нужно думать о разных идентификаторах - у вас будет отдельное окно для каждого отдельного ключа.Ваша оконная функция просто нуждается в итерации по содержимому окна, чтобы найти UserMessage с наибольшей временной меткой и вывести его как результат окна (для этого ключа).Тем не менее, есть встроенная функция, которая делает именно это - посмотрите на документацию для maxBy () - поэтому в этом случае нет необходимости в оконной функции.

Грубо говоря, тогдаэто будет выглядеть как

stream.keyBy("id")
  .timeWindow(Time.minutes(10))
  .maxBy("time")
  .print()
...