0

我们正在评估 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 中没有任何结果......

我的问题:

  1. 我想使用 NEsper 的方式是受支持的用例,还是我失败的根本原因?

  2. 如果这是一个有效的用例:我的错误在哪里?如何以高效的方式获得我想要的结果?

  3. 当使用“group by”而不是“context”时,为什么我的 EPL 语句中没有 NewEvents?

4

1 回答 1

1

对 1), 是的

2)这是有效的,你的 EPL 设计可能有点低效。您可能希望通过使用过滤器索引和索引条目来了解模式的工作原理,它们的创建成本更高,但在丢弃不需要的事件方面非常快。阅读: http ://esper.espertech.com/release-7.1.0/esper-reference/html_single/index.html#processingmodel_indexes_filterindexes以及 http://esper.espertech.com/release-7.1.0/esper-reference /html_single/index.html#pattern-walkthrough 也许试试“以前的”。分别衡量每个语句的性能。此外,我不认为 CSV 适配器针对处理大文件进行了优化。我认为 CSV 可能不会流式传输。

3)检查你的代码?不要将 CSV 文件用于大型文件。确保连接了监听器。

于 2018-08-16T11:51:58.720 回答