我们正在评估 NEsper。我们的重点是监控企业环境中的数据质量。在一个应用程序中,我们将记录很多字段的每一个变化——例如在一个“订单”中。所以我们有像
- 收货人姓名
- 收货人街道
- 订购日期
....还有更多领域。正如您可以想象的那样,日志文件会变得很大。
因为数据是由不同的客户发送的,并且是在应用程序中导入的,所以我们要分析有多少(以及哪些)字段从“无值”更新为“有值”(仅作为示例)。
我试图用这些字段构建一个测试用例
- 订单参考
- 字段名
- 字段值
对于我的测试用例,我添加了两个带有上下文信息的语句。第一个应该只计算每个订单的一般变化:
epService.EPAdministrator.CreateEPL("create context RefContext partition by Ref from LogEvent");
var userChanges = epService.EPAdministrator.CreateEPL("context RefContext select count(*) as x, context.key1 as Ref from LogEvent");
第二条语句应该计算从“无值”到“有值”的更新:
epService.EPAdministrator.CreateEPL("create context FieldAndRefContext partition by Ref,Fieldname from LogEvent");
var countOfDataInput = epService.EPAdministrator.CreateEPL("context FieldAndRefContext SELECT context.key1 as Ref, context.key2 as Fieldname,count(*) as x from pattern[every (a=LogEvent(Value = '') -> b=LogEvent(Value != ''))]");
要读取测试日志文件,我使用 csvInputAdapter:
CSVInputAdapterSpec csvSpec = new CSVInputAdapterSpec(ais, "LogEvent");
csvInputAdapter = new CSVInputAdapter(epService.Container, epService, csvSpec);
csvInputAdapter.Start();
我不想使用更新侦听器,因为我只对所有事件的结果感兴趣(可能这是不可能的,这是我的失败)。
因此,在读取 csv(csvInputAdapter.Start() 返回)后,我读取了所有事件,这些事件存储在语句 NewEvents-Stream 中。
在 CSV 文件中使用 10 个条目一切正常。使用 100 万行需要很长的时间。我尝试不使用 EPL-Statement(所以只是导入 CSV)——大约需要 5 秒。对于第一个语句(不是复杂模式语句),我总是在 20 分钟后停止 - 所以我不确定需要多长时间。
然后我更改了第一条语句的 EPL:我引入了一个 group by 而不是 context。
select Ref,count(*) as x from LogEvent group by Ref
现在它真的很快 - 但在 CSVInputAdapter 回来后我的 NewEvents Stream 中没有任何结果......
我的问题:
我想使用 NEsper 的方式是受支持的用例,还是我失败的根本原因?
如果这是一个有效的用例:我的错误在哪里?如何以高效的方式获得我想要的结果?
当使用“group by”而不是“context”时,为什么我的 EPL 语句中没有 NewEvents?