首页 > 解决方案 > 如何在 Esper 中使用 match_recognize 对事件流中事件的未知属性进行模式匹配?

问题描述

我是 Esper 的新手,我正在尝试从具有多个高速事件的事件流中过滤事件属性。

我正在使用 Kafka 将 CSV 从生产者逐行发送到消费者,在消费者处,我将这些行转换为 HashMap 并在运行时在 Esper 中创建事件。

例如,我在下面列出了每 1 秒发生一次的事件

天气事件流:

E1 = {hum=51.0, precipi=1, precipm=1, tempi=57.9, icon=clear,picking_datetime=2016-09-26 02:51:00, tempm=14.4, Thunder=0, windchilli=, wgusti=,压力i=30.18,windchillm=}

E2 = {hum=51.5, precipi=1, precipm=1, tempi=58.9, icon=clear,picking_datetime=2016-09-26 02:55:00, tempm=14.5, Thunder=0, windchilli=, wgusti=,压力i=31.18,windchillm=}

E3 = {hum=52, precipi=1, precipm=1, tempi=59.9, icon=clear,picking_datetime=2016-09-26 02:59:00, tempm=14.6, Thunder=0, windchilli=, wgusti=,压力i=32.18, windchillm=}#

其中 E1, E2...EN 是 WeatherEvent 中的多个事件

在上述事件中,我只想过滤掉诸如嗡嗡声、速度、温度和压力之类的属性,因为它们会随着时间的推移而变化(在 4 秒内),并且不想关心根本没有变化或真正变化的属性慢慢地。

使用下面的 EPL 查询,我可以过滤掉 temp、hum 等属性

@Name('Out') select * from weatherEvent.win:time(10 sec) match_recognize (partition bypicking_datetime?measures A.tempm? as a_temp, B.tempm? as b_temp pattern (AB) define B as Math.abs( B.tempm? - A.tempm?) > 0 )

问题是我只能在模式匹配查询中指定 tempm 或 hum 时这样做。

但是由于数据来自 CSV 并且它具有高维度或特征,所以我事先不知道事件的属性是什么。

我希望 Esper 自动检测正在更改的功能/属性(在运行时)并将其过滤掉,而无需我指定事件的属性。

任何想法如何做到这一点?埃斯珀甚至有可能吗?如果没有,我可以使用 Siddhi、OracleCEP 等其他 CEP 引擎吗?

标签: apache-kafkacomplex-event-processingespermatch-recognize

解决方案


你可以加一个“?” 到事件属性名称以获取在定义事件类型时未知的那些属性的值。这称为动态属性,请参阅文档。返回的类型是 Object 所以你需要向下转型。


推荐阅读