SODBASE CEP学习进阶篇(四):自己控制时钟和时间戳
2015-06-23 17:02
543 查看
SODBASE CEP允许使用各类型的自定义时钟。例如,一些应用里会用到第三方系统生成的时间戳,另外,有的系统并不是按通常意义的时钟如最小单位毫秒来计时。每个事件都有两个时间戳:开始时间和结束时间。基本事件的开始时间和结束时间相等。控制时钟,在SODBASE CEP引擎中,可以通过设置事件的时间戳属性来实现。
(1)下载GUI建模工具SODBASE
Studio 2.0.20或以上版本,解压
(2)下载EPL语句模型文件onbatch.sod,onbatchinput.sod
(3)双击cepstudio.exe打开SODBASE Studio,导入上一步下载的模型文件
(4)点击onbatch,工作面板右键测试运行,启动模型
点击onbatchinput,工作面板右键测试运行,启动模拟数据源
输出
_end_time_可以设置输出事件的时间戳。
股票数据中原是用毫秒作时间戳,我们通过一个SELECT语句将时间戳改为递增序列
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条件去掉关联条件。
set(keystring,value) get(keystring)是2.0.22(sp2)以上版本增加的内置函数,功能为存取变量寄存器keystring的值。
SODBASE CEP用于轻松、高效实施数据监测、监控类、交易类、实时分析类项目
。EPL语法见SODSQL写法与示例。图形化建模请使用SODBASE
Studio。
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。
相关文章推荐
- 获取浏览器的ip以及省份
- 禁用SSH主机公钥检查
- 使用Data URI为网站提速
- 随机生成验证码
- 图片数据Base64编解码(java实现)
- Xcode版本控制Git及在GitHub/Oschina提交项目
- JSON vs ProtoBuf vs XML
- 我想买的书
- sql中的join语句
- 练习代码(五)接口与内部类(二)
- LCA倍增法
- .net开发windows服务小结
- extjs动态添加列
- hbulider mui框架
- Oracle Flashback Technologies - 闪回查询
- SAT阅读练习题:Reading Comprehension Test 1
- Conllection和Map
- 上海展讯repo下载代码
- ZOOKEEPER的作用
- 单片机的数字滤波器设计