Apache kafka 多种事件类型的ApacheFlink CEP模式

Apache kafka 多种事件类型的ApacheFlink CEP模式,apache-kafka,apache-flink,flink-cep,complex-event-processing,Apache Kafka,Apache Flink,Flink Cep,Complex Event Processing,目前,我正在做一个学期项目,在这个项目中,我必须认识到由三个事件组成的系列。像P->R->P 在同一主题中,我们有两种不同的事件类型,它们通过卡夫卡连接器使用 我创建了一个名为Event的父类,其他两种类型都是从该类派生的 Kafka连接器将JSON与EventSchema反序列化到父类事件 val consumer = new FlinkKafkaConsumer("events", new EventSchema, properties) val stream = env.addSource

目前,我正在做一个学期项目,在这个项目中,我必须认识到由三个事件组成的系列。像
P->R->P

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

我创建了一个名为Event的父类,其他两种类型都是从该类派生的

Kafka连接器将JSON与EventSchema反序列化到父类事件

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")
当前的问题是,如果我发送三条具有适当格式的消息,则该模式将无法识别

我还试过别的。。我改变了这种模式:

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")
这种模式很有效,但后来我无法将事件类转换为位置或识别


我在这里遗漏了什么?

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

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);
DataStream input=env.fromElements(
新事件(1,“foo”,4.0),
新的子事件(2,“foo”,4.0,1.0),
新的子事件(3,“foo”,4.0,1.0),
新的子事件(4,“foo”,4.0,1.0),
新事件(5,“中间”,5.0)
);
Pattern Pattern=Pattern.begin(“start”).subtype(SubEvent.class)
.followerdByany(“中间”).subtype(SubEvent.class)
.followerdbyany(“end”).subtype(SubEvent.class);

您传递给模式的元素可能是事件?没错,但是不可能有不同类型的事件,从事件时间开始按升序排列并在其中找到模式吗?如果所有事件都来自一个主题,或者每个事件都有自己的主题,则不应说明问题..在从kafka反序列化时,是否使用子类型初始化对象?我只是使用
val kafkaSource=new FlinkKafkaConsumer(“sp”,new EventSchema,properties)将其序列化为事件
因为要运行,一个主题中有多个类型。。但是我可以将多个不同类型的KafkaSource合并为一个吗?您可以将EventSchema的代码放在这里吗?根据你的描述,我试过了,但效果不错。你真是个天才!只有一件事你的例子不起作用。。当我使用
asInstanceOf
时,会发生一个异常,我无法将事件转换到位置。。因此,我将其与
mapper.readValue(bytes,classOf[Position])
交换,并重新序列化了它。如果你能在你的帖子中编辑这个,我会接受答案是!再次感谢你@这是你需要的零钱吗?