1

问题很简单:使用 Esper 引擎从 2 个不同的流中只提取不存在的记录。
ID 存在于 streamA 中,但不存在于 streamB 中。

在 SQL 中,它看起来像这样:

SELECT *
FROM   tableA
WHERE  NOT EXISTS (SELECT *
                   FROM   tableB
                   WHERE  tableA.Id = tableB.Id)

我已经尝试过 Esper 风格,但它不起作用:

SELECT *
FROM  streamA.win:ext_timed(timestamp, 5 seconds) as stream_A
WHERE NOT EXSITS
    (SELECT stream_B.Id
     FROM streamB.win:ext_timed(timestamp, 5 seconds) as stream_B
     WHERE stream_A.Id = stream_B.Id)

可悲的是,如果 stream_A.Id 在 stream_B.id 之前插入,它将回答查询条件并且查询将不起作用。

关于如何使用 Esper 识别“ID 存在于 streamA 但不在 streamB 中”的任何建议?

4

1 回答 1

1

一种简单的方法是对流进行时间排序,以便在发送事件之前对 A 和 B 进行时间戳排序。

或者您可以延迟 A,例如以下查询:

select * from pattern [every a=streamA -> timer:interval(1 sec)] as delayed_a where not exists (... where delayed_a.a.id = b.id)

streamA 不需要外部定时窗口。对于外部定时行为,通常使用外部定时器事件。

于 2013-05-27T22:14:03.160 回答