基于时间的siddhi数据集结

时间:2019-03-11 07:43:46

标签: siddhi

我正在尝试根据时间窗口汇总传感器数据,并在达到30秒窗口(汇总)后将其写入Cassandra。

例如,一个名为“ temp”的传感器在30秒内发送3个读数。我希望获得最近30秒钟该传感器的平均值,并在窗口完成时将平均值写入Cassandra。

这是我的代码

BasicConfigurator.configure();


        // Create Siddhi Application
        String siddhiApp = "define stream SensorEventStream (sensorid string, value double); " +
                " " +
                "@info(name = 'query1') " +
                "from SensorEventStream#window.time(30 sec)  " +
                "select sensorid, avg(value) as value " +
                "group by sensorid " +
                "insert into AggregateSensorEventStream ;";

        // Creating Siddhi Manager
        SiddhiManager siddhiManager = new SiddhiManager();

        //Generating runtime
        SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiApp);

        //Adding callback to retrieve output events from query
        siddhiAppRuntime.addCallback("AggregateSensorEventStream", new StreamCallback() {


            @Override
            public void receive(org.wso2.siddhi.core.event.Event[] events) {
                 EventPrinter.print(events);
            }
        });

        //Retrieving input handler to push events into Siddhi
        InputHandler inputHandler = siddhiAppRuntime.getInputHandler("SensorEventStream");

        //Starting event processing
        siddhiAppRuntime.start();

        //Sending events to Siddhi
        inputHandler.send(new Object[]{"Temp", 26d});
        Thread.sleep(1000);
        inputHandler.send(new Object[]{"Temp", 25d});
        Thread.sleep(1000);
        inputHandler.send(new Object[]{"Temp", 24d});
        Thread.sleep(60000);
        inputHandler.send(new Object[]{"Temp", 23d});

        //Shutting down the runtime
        siddhiAppRuntime.shutdown();

        //Shutting down Siddhi
        siddhiManager.shutdown();

输出是这样的

0 [main] INFO org.wso2.siddhi.core.util.EventPrinter  - [Event{timestamp=1552281656960, data=[Temp, 26.0], isExpired=false}]
1002 [main] INFO org.wso2.siddhi.core.util.EventPrinter  - [Event{timestamp=1552281657971, data=[Temp, 25.5], isExpired=false}]
2003 [main] INFO org.wso2.siddhi.core.util.EventPrinter  - [Event{timestamp=1552281658972, data=[Temp, 25.0], isExpired=false}]
62004 [main] INFO org.wso2.siddhi.core.util.EventPrinter  - [Event{timestamp=1552281718972, data=[Temp, 23.0], isExpired=false}]

从此演示代码中,我看到它正在立即发送3个事件的temp的平均平均值,并且在30秒的窗口后,它没有执行任何操作。然后打印23。

在30秒钟后窗口向上滚动时如何获得通知?我认为这就是接收功能的作用。

我不确定我是否误解了这里的功能。 siddi完全有可能吗?

1 个答案:

答案 0 :(得分:0)

这是预期的行为,该窗口是滑动窗口。在这里,当第一个事件发生时(第一秒),窗口仅保存第一个事件,因此平均值为26。然后,当第二个事件到达时,窗口既具有26d也具有25d,则平均值为25.5。同样,第三秒平均值为25d。然后,这些事件将在31、32和33秒从窗口中消失。因此,当第4个事件到来时(第63秒),窗口中只有最新事件,因此平均值将是值本身。根据事件发生前最后30秒收到的事件,此窗口会在事件到达后立即计算平均值。

从您的问题来看,您似乎想要timeBatch窗口。此处,平均值仅在批次结束时计算。例如,在这种情况下,第30、60、90秒等等。请参阅timeBatch文档以获取示例。