如何在时间范围内获取最新值

时间:2018-09-28 15:35:08

标签: scala apache-flink

这是我的流式数据的样子:

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

在我们的窗口中考虑以上所有示例。我的用例获得了最新的唯一ID。

我需要输出如下:

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

如何在Flink中实现这一目标?

我知道窗口函数WindowFunction。但是,我无法全力以赴。

我试图这样做只是为了获得不同的ID。如何将该功能扩展到我的用例?

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 :(得分:1)

如果您通过id字段为流设置键,则无需考虑不同的id-每个不同的键都有一个单独的窗口。您的窗口函数只需要遍历窗口内容,以找到时间戳最大的UserMessage,并将其作为窗口的结果输出(针对该键)。但是,有一个内置函数可以做到这一点-请查看maxBy()的documentation-因此在这种情况下不需要窗口函数。

那么大致来说,这看起来像

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