Flink按字段ID对记录进行分组的最佳方法

时间:2019-07-09 12:47:51

标签: java apache-kafka apache-flink flink-streaming

我正在设置与Kafka代理连接的Apache Flink。

我随机收到以下消息:

  • message(timestamp = [..],index = 1,someData = [..])
  • message(timestamp = [..],index = 2,someData = [..])
  • 消息(时间戳= [..],索引= 3,someData = [..])
  • message(timestamp = [..],index = 2,someData = [..])
  • 消息(时间戳= [..],索引= 3,someData = [..])
  • message(timestamp = [..],index = 1,someData = [..])

我来自Kafka的记录有一个index字段。

在我的应用程序中,我需要计算出具有相同ID的最后两条记录,然后立即发送响应。

例如,这两个:

  • message(timestamp = [..],index = 1,someData = [..])
  • message(timestamp = [..],index = 1,someData = [..])

用相同的索引字段存储和计算最后两个记录的最佳方法是什么?你能告诉我一些提示吗?

1 个答案:

答案 0 :(得分:0)

您的要求尚不完全清楚,但是您可能想了解的机制是使用keyBy(e -> e.index)按索引字段对流进行分组/分区,并使用keyed state记住上一个事件(或两个),用于索引的每个值。

如果您需要考虑时间戳,并且事件流是乱序的,即使在索引的单个值之内,那么您将需要首先按时间戳对流进行排序。在这种情况下,如果您使用Flink SQL进行排序,您将拥有更轻松的时间,然后您可以使用match_recognize来进行模式识别,尽管对于这样一个简单的模式而言,这可能会显得有些过头。这是example进行排序的方法。