【问题标题】:Esper: group by value in a named window and use this grouped value to determine the output idEsper:在命名窗口中按值分组,并使用此分组值确定输出 id
【发布时间】:2020-09-17 12:54:27
【问题描述】:

我想创建一个命名窗口,它需要最后 20 秒的速度设置 (1-10) 和功率输出 (float)。然后我想查询这个以获得每个速度设置的平均功率(从 1-10)。对于每个速度设置,我需要指定一个特定的输出 ID。我尝试使用表达式将速度转换为此输出 id 来执行此操作,但无论我采用哪种方式,我都会收到错误“表达式需要流名称作为参数”。

谁能指出正确的表达式+如何使用表达式以获得我想要的输出?

如果你能指出一个更好的方法来做到这一点,那也很好。我是一个 esper 新手 + 不懂 Java,我在带有 CEP 堆栈的服务器上运行这些脚本,我不知道引擎盖下发生了什么,所以我发现很难排除故障!

CREATE expression getOutput {
   speed =>
      when speed = 1 then 4000
      when speed = 2 then 5000
      ....
};

CREATE window Power.win:time(20 sec) as (power double, speed int);

INSERT into PortPower
SELECT 
    powerEvent.value as power,
    cast(speedSetting.value, int) as speed
FROM 
    Event(id = 1000).std:lastevent() as powerEvent,
    Event(id = 2000).std:lastevent() as speedEvent;
    

INSERT into Event
SELECT
    getOutput(powerEvent.speed) as id,
    avg(PowerEvent.power) as value
FROM
    Power as PowerEvent
GROUP BY
   PowerEvent.speed
HAVING
   count(PowerEvent.speed) > 0;

【问题讨论】:

    标签: sql influxdb complex-event-processing esper


    【解决方案1】:

    “表达式需要流名称作为参数”我认为是旧版本的错误消息,是 EPL 的一个版本,只允许表达式参数的流名称。尝试使用没有此限制的当前版本。

    您的 EPL 比问题中提出的要多。在提出问题时,最好只关注与特定问题相关的问题。请编辑问题并删除所有不相关的内容。在每个帖子中问一个明确的最小问题可以帮助我节省时间。

    由于你坚持使用旧版本,你可以像这样使用just insert into:

    insert into ResultStream select ... from ....
    
    select ..., 
      case when speed = 1 then 4000 .... end as speedMappedToWhatever 
    from ResultStream
    

    【讨论】:

    • 感谢您的回复。不幸的是,我对版本没有发言权,至少这个项目的基础设施不能改变。我确实减少了脚本以尝试制作 MRE,但由于我不知道出了什么问题,我不想省略我犯的错误!看看剧本,我写的有什么明显的错误吗?
    • 就像我说的,你可能使用了一些旧版本,所以这就是问题所在。我建议了一个替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2022-12-09
    • 1970-01-01
    • 2018-11-29
    相关资源
    最近更新 更多