apache-kafka - 如何在 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 引擎吗?
解决方案
你可以加一个“?” 到事件属性名称以获取在定义事件类型时未知的那些属性的值。这称为动态属性,请参阅文档。返回的类型是 Object 所以你需要向下转型。
推荐阅读
- javascript - 用php从输入框中获取值
- android - EAGAIN 何时 open() 会失败?
- python - 以相反的顺序应用 Python Pandas 指数加权平均值
- date - 解析 UTC 日期字符串并转换为不同的格式
- ssis - SSIS OLE DB 数据源输入
- excel - 在 vb 中使用 Epplus 更改条形图的条形大小
- vba - 使用指定的子字符串将单元格链接到文件名?Excel
- javascript - WTForms-Javascript:将 onclick 传递给 WTF 字段
- html - 尽管 div 被隐藏,但仍宣布 aria-live 文本更改
- angular - Azure Web App wwwroot 在发布时重复