多种事件类型的Apache Flink CEP模式

时间:2019-01-16 18:07:39

标签: apache-kafka apache-flink flink-cep complex-event-processing

目前,我正在研究一个学期项目,我必须认识这三个事件系列。像P -> R -> P

我们有两种不同的事件类型,它们是通过同一主题中的Kafka连接器使用的。

我创建了一个称为Event的父类,其他两个类型均从该父类派生。

Kafka连接器使用EventSchema将JSON反序列化为父类Event。

val consumer = new FlinkKafkaConsumer("events", new EventSchema, properties)
val stream = env.addSource(consumer)

模式如下:

val pattern = Pattern
  .begin[Event]("before")
  .subtype(classOf[Position])
  .next("recognized")
  .subtype(classOf[Recognized])
  .next("after")
  .subtype(classOf[Position])

当前的问题是,如果我以适当的格式发送三封邮件,则该模式将无法识别。

我尝试过的其他方法..我改变了这种模式:

val pattern = Pattern
  .begin[Event]("before")
  .where(e => e.getType == "position")
  .next("recognized")
  .where(e => e.getType == "recognition")
  .next("after")
  .where(e => e.getType == "position")

此模式有效,但是稍后我无法将Event类转换为位置或识别。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

根据评论,我认为您应该返回子类型实例而不是事件。这是我为您提供的示例代码:

val event = mapper.readValue(bytes, classOf[Event])
event.getType match {
  case "position" => mapper.readValue(bytes, classOf[Position])
  case "recognition" => mapper.readValue(bytes, classOf[Recognized])
  case _ =>
}

我在CEPITCase.java的一个测试案例中成功地尝试了该示例。

DataStream<Event> input = env.fromElements(
  new Event(1, "foo", 4.0),
  new SubEvent(2, "foo", 4.0, 1.0),
  new SubEvent(3, "foo", 4.0, 1.0),
  new SubEvent(4, "foo", 4.0, 1.0),
  new Event(5, "middle", 5.0)
);

Pattern<Event, ?> pattern = Pattern.<Event>begin("start").subtype(SubEvent.class)
.followedByAny("middle").subtype(SubEvent.class)
.followedByAny("end").subtype(SubEvent.class);