SODBASE CEP学习进阶篇(四):自己控制时钟和时间戳

SODBASE CEP允许使用各类型的自定义时钟。例如,一些应用里会用到第三方系统生成的时间戳,另外,有的系统并不是按通常意义的时钟如最小单位毫秒来计时。每个事件都有两个时间戳:开始时间和结束时间。基本事件的开始时间和结束时间相等。控制时钟,在SODBASE CEP引擎中,可以通过设置事件的时间戳属性来实现。

1.示例操作步骤

功能:5秒的时间窗口输出数据,但如果没到5秒输入数据积达到10个,也输出。应用场景为在批量入库时,如果时间设置的过大,入库不及时,设置的过小,又入库太频繁,所以同时给时间和数量两个判断条件。

(1)下载GUI建模工具SODBASE Studio 2.0.20或以上版本,解压

(2)下载EPL语句模型文件onbatch.sod,onbatchinput.sod

(3)双击cepstudio.exe打开SODBASE Studio,导入上一步下载的模型文件

(4)点击onbatch,工作面板右键测试运行,启动模型

 点击onbatchinput,工作面板右键测试运行,启动模拟数据源

输出

*******ComplexEvent********
0 se name: IBM, price: 52, timestamp: 1435240395390, type: data 0 
[
1 data name: Google, price: 14, timestamp: 1435240395593, type: data 1 
2 data name: Google, price: 95, timestamp: 1435240395796, type: data 2 
3 data name: Google, price: 72, timestamp: 1435240396000, type: data 3 
4 data name: Sun, price: 5, timestamp: 1435240396203, type: data 4 
5 data name: Sun, price: 4, timestamp: 1435240396406, type: data 5 
6 data name: Sun, price: 15, timestamp: 1435240396593, type: data 6 
7 data name: Google, price: 42, timestamp: 1435240396796, type: data 7 
8 data name: Google, price: 84, timestamp: 1435240397000, type: data 8 
]
9 ee name: Google, price: 8, timestamp: 1435240397203, type: data 9 

*******ComplexEvent********
10 se name: Google, price: 74, timestamp: 1435240397406, type: data 10 
[
11 data name: Sun, price: 19, timestamp: 1435240397593, type: data 11 
12 data name: Sun, price: 21, timestamp: 1435240397796, type: data 12 
13 data name: Sun, price: 1, timestamp: 1435240398000, type: data 13 
14 data name: Google, price: 46, timestamp: 1435240398203, type: data 14 
15 data name: Google, price: 34, timestamp: 1435240398406, type: data 15 
16 data name: Sun, price: 6, timestamp: 1435240398609, type: data 16 
17 data name: IBM, price: 13, timestamp: 1435240398796, type: data 17 
18 data name: IBM, price: 35, timestamp: 1435240399000, type: data 18 
]
19 ee name: Google, price: 20, timestamp: 1435240399203, type: data 19 
......


2.工作原理

2.1 时间戳设置修改方法

Java API中,Event类和它的子类PrimitiveEvent,ComplexEvent都有两个long类型的属性start_ts,end_ts。通过setStart_ts(long start_ts)和setEnd_ts(long end_ts)就可以设置时间戳。基本事件PrimitiveEvent的开始时间start_ts和结束时间end_ts应相等。另外,新版本中在类SQL语句中通过SELECT语句AS _start_time_或AS _end_time_可以设置输出事件的时间戳。

2.2 读取方法

同理,在Java API中用getStart_ts()和getEnd_ts()可以获取一个事件的时间戳。在EPL类SQL语句中可以用_start_time_和_end_time_属性来读取事件的时间戳。


2.3示例的类SQL语句

这里的股票数据输入用到了将递增序列作为时间戳,而毫秒时间戳作为timestamp属性值。具体类SQL语句onbatch如下。

CREATE QUERY onbatch 
SELECT * 
FROM se:onbatchinput,data:onbatchinput,ee:onbatchinput 
PATTERN se;data^*;ee  
WHERE or(count(data.name)=8,ee.timestamp-se.timestamp>=5000)  
WITHIN 10  
BATCHMODE


股票数据中原是用毫秒作时间戳,我们通过一个SELECT语句将时间戳改为递增序列
CREATE QUERY onbatchinput 
SELECT T1.price AS price,T1.name AS name,autoincrement('onbatch.inc1','0') AS _end_time_,T1._end_time_ AS timestamp,'data' AS type 
FROM T1:stock 
PATTERN T1 
WITHIN 0 


autoincrement('onbatch.inc1','0')用了产生递增序列的系统内部函数,建立一个系统级别的long型全局计数器''conbatch.inc1',初始值为0,每调用一次增加1。这里是做Demo用,建议读者使用自定义函数实现递增序列,更容易控制和隔离。在onbatch有输出时也可以将计数器清零。

2.4 查询优化

单流条件性能要优于多流关联条件。如果WITHIN窗口大,那么ee和se作关联条件timestamp-se.timestamp>=5000会对整体性能造成一定影响。对本文示例,可用一个变量寄存器'last_o_id_'存储上批次输出ee事件序列号,EPL的WHERE条件去掉关联条件。

CREATE QUERY onbatch 
SELECT set('last_o_id_',ee._end_time_) 
FROM se:onbatchinput,data:onbatchinput,ee:onbatchinput 
PATTERN se;data^+;ee  
WHERE or(ee._end_time_> atoi(get('last_o_id_')) + 999 ,ee.timestamp>=atoi(get('last_o_id_'))+5000)
WITHIN 999  
BATCHMODE

set(keystring,value) get(keystring)是2.0.22(sp2)以上版本增加的内置函数,功能为存取变量寄存器keystring的值。

SODBASE CEP用于轻松、高效实施数据监测、监控类、交易类、实时分析类项目微笑。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE Studio


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值