如何使用Apache Flink对流进行会话化?

时间:2017-06-18 12:53:25

标签: scala apache-flink stream-processing

我想对此流进行会话:1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,0,3,3,3,5, ......参加这些会议:

1,1,1
2,2,2,2,2
3,3,3,3,3,3,3
0
3,3,3
5

我已经编写了CustomTrigger来检测流元素何时从1变为2(2到3,3到0等等),然后触发触发器。但这不是解决方案,因为当我处理2的第一个元素时,触发触发器的窗口将是[1,1,1,2],但是我需要触发最后一个元素的触发器。 1'第

以下是我的自定义触发器类中的onElement函数的pesudo:

override def onElement(element: Session, timestamp: Long, window: W, ctx: TriggerContext): TriggerResult = {
    if (prevState == element.value) {
      prevState = element.value
      TriggerResult.CONTINUE
    } else {
      prevState = element.value
      TriggerResult.FIRE
    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我认为使用FlatMapFunction的{​​{1}}是实现此用例的最简单方法。

当新元素到达时(即调用ListState方法),您检查值是否已更改。如果值未更改,则将元素追加到状态。如果值已更改,则将当前列表状态作为会话发出,清除列表,并将新元素作为第一个插入列表状态。

但是,您应该记住,这假设保留了元素的顺序。 Flink确保在一个分区内,即只要元素不被洗牌并且所有运算符都以相同的并行性运行。