使用Blink CEP实现差值聚合计算
使用Blink SQL+UDAF实现差值聚合计算介绍了如何使用Blink SQL+UDAF实现实时流上的差值聚合计算,后来在与@付典就业务需求和具体实现方式进行探讨时,付典提出通过CEP实现的思路和方法。
本文介绍通过CEP实现实时流上的差值聚合计算。
感谢@付典在实现过程中的指导。笔者水平有限,若有纰漏,请批评指出。
一、客户需求
电网公司每天采集各个用户的电表数据(格式如下表),其中data_date为电表数据上报时间,cons_id为电表id,r1为电表度数,其他字段与计算逻辑无关,可忽略。为了后续演示方便,仅输入cons_id=100000002的数据。
no(string) | data_date(string) | cons_id(string) | org_no(string) | r1(double) |
---|---|---|---|---|
101 | 20190716 | 100000002 | 35401 | 13.76 |
101 | 20190717 | 100000002 | 35401 | 14.12 |
101 | 20190718 | 100000002 | 35401 | 16.59 |
101 | 20190719 | 100000002 | 35401 | 18.89 |
表1:输入数据
电网公司希望通过实时计算(Blink)对电表数据处理后,每天得到每个电表最近两天(当天和前一天)的差值数据,结果类似如下表:
cons_id(string) | data_date(string) | subDegreeR1(double) |
---|---|---|
100000002 | 20190717 | 0.36 |
100000002 | 20190718 | 2.47 |
100000002 | 20190719 | 2.3 |
表2:期望的输出数据
二、需求分析
根据业务需求以及CEP跨事件模式匹配的特性,定义两个CEP事件e1和e2,输出e2.r1-e1.r1即可得到差值。
三、CEP开发及测试结果
参考复杂事件处理(CEP)语句,CEP代码如下:
CREATE TABLE input_dh_e_mp_read_curve (`no` VARCHAR,data_date VARCHAR,cons_id VARCHAR,org_no VARCHAR,r1 DOUBLE,ts as TO_TIMESTAMP(concat(data_date,'000000'),'yyyyMMddHHmmss'),WATERMARK wk FOR ts as withOffset(ts, 2000)
) WITH (type = 'datahub',endPoint = 'http://dh-cn-shanghai.aliyun-inc.com',roleArn='acs:ram::XXX:role/aliyunstreamdefaultrole',project = 'jszc_datahub',topic = 'input_dh_e_mp_read_curve'
);CREATE TABLE data_out(cons_id varchar,data_date varchar,subDegreeR1 DOUBLE
)with(type = 'print'
);insert into data_out
selectcons_id,data_date,subDegreeR1
from input_dh_e_mp_read_curve
MATCH_RECOGNIZE(PARTITION BY cons_idORDER BY tsMEASURESe2.data_date as data_date,e2.r1 - e1.r1 as subDegreeR1ONE ROW PER MATCHAFTER MATCH SKIP TO NEXT ROWPATTERN(e1 e2)DEFINEe1 as TRUE,e2 as TRUE
);
由于使用了print connector,从对应的sink的taskmanager.out日志中可以查看到输出如下:
task-1> (+)100000002,20190717,0.35999999999999943
task-1> (+)100000002,20190718,2.4700000000000006
对比期望输出(表2),20190717和20190718两个窗口的数据均正确,表明业务逻辑正确,但此输出与期望输出有少许差异:
(1)20190719的数据没有输出,这是因为我们设置了watermark,测试环境下20190719之后没有数据进来触发20190719对应的窗口的结束。
四、其他说明
1、对比使用Blink SQL+UDAF实现差值聚合计算(1),我们可以看出使用CEP开发代码非常简洁,所以在跨事件处理的情况下CEP还是非常的合适。从另外一个方面讲,同样的需求有不同的实现方式,所以融会贯通Blink SQL中的各种语法,利用更合适的语法来实现业务需求,将可能大大提升工作效率和业务性能。
2、在实现本案例时,笔者发现使用CEP时有如下需要注意的地方:
(1)partiton by里的字段(如本案的cons_id),默认会带到输出里,若同时在MEASURES中定义,则可能会报类似如下错误:
(2)define及其内容必须定义,否则前端页面提示类似如下错误:
原文链接
本文为云栖社区原创内容,未经允许不得转载。
使用Blink CEP实现差值聚合计算相关推荐
- sql 差值_使用Blink CEP实现差值聚合计算
简介: 本文介绍通过CEP实现实时流上的差值聚合计算. 使用Blink SQL+UDAF实现差值聚合计算介绍了如何使用Blink SQL+UDAF实现实时流上的差值聚合计算,后来在与@付典就业务需求和 ...
- 使用Blink SQL+UDAF实现差值聚合计算
本案例根据某电网公司的真实业务需求,通过Blink SQL+UDAF实现实时流上的差值聚合计算,通过本案例,让读者熟悉UDAF编写,并理解UDAF中的方法调用关系和顺序. 感谢@军长在实现过程中的指导 ...
- php求两个数组的差值,数组计算差值及项的小计,该如何处理
数组计算差值及项的小计 本帖最后由 lazygc520 于 2014-04-14 16:19:41 编辑 $s = array ( 0 => array ( 0 => array ( 0 ...
- JS-计算日期差值;计算日期之间的月数
计算两天之间的日期差值 // 输入格式:yyyy-MM-DD function daysBetween(sDate1, sDate2) {//Date.parse() 解析一个日期时间字符串,并返回1 ...
- mysql 取差值_MySQL计算相邻两行某列差值的方法
简述 博主最近因工作任务缠身,都无暇顾及到我的这片自留地了.前段时间稍有空闲,花了较多的精力学习<啊哈算法>,从中学习到很多之前没有太注重的内容,收益颇丰.但是这些算法题目还没有看完,等后 ...
- mysql timestamp 差值_SQL计算timestamp的差值实例分享
本文主要介绍了SQL计算timestamp的差值的方法的相关资料,需要的朋友可以参考下,希望能帮助到大家. SQL计算timestamp的差值的方法 概述 有时候我们需要按照时间找出某些记录,比如说: ...
- python计算日期间的差值,python 计算时间、日期差值类
环境:win10+python3x V:1.0 简单实现了一下功能本地测试可用,记录下次接着二次开发用 import datetime import re class TimeDifferenceC( ...
- php 计算数组的差值,数组计算差值及项的小计,该如何处理
本帖最后由 lazygc520 于 2014-04-14 16:19:41 编辑 $s = array ( 0 => array ( 0 => array ( 0 => '2014- ...
- mysql计算两个月份之间的差值_MySQL计算两个日期相差的天数、月数、年数
MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等. SELECT TIMESTAMPDIFF ...
最新文章
- openpyxl模块介绍
- 研究发现大部分企业没有在云端采用Office 365
- unix环境高级编程-进程间通信
- 【项目管理】敏捷原则
- 如何启用 express debug 模式
- python声明编码格式_使用python将doc文件转为utf8编码格式的txt
- 一文看懂专有网络和交换机的定义及关系
- Python 实现简单的爬虫
- Android工程中追踪修改bug的总结
- C# 通用树形数据结构
- 基于matlab的模糊PID控制仿真
- 网络唤醒 php,go实现网络唤醒远程开机(Wake on Lan)
- Windows Terminal 快速安装
- 校园无线网登陆成功,但打开浏览器不能上网怎么办?标签上显示注销页怎么办?
- 战地2服务器地图修改,《战地2》地图修改秘籍
- VS2022写Qt代码遇到的问题之 C2504 “xxx”: 未定义基类 (编译源文件
- 最佳光圈值 (Optimum Aperture)
- Cobbler自动化装机服务详细介绍
- React解密:React高阶组件是什么?
- 洛谷 P1332 血色先锋队
热门文章
- php 共享内存列队,php中对共享内存,消息队列的操作
- python 安卓app开发环境搭建_基于react-native的APP开发环境配置
- 计算机三级数据库上机怎么考,最新计算机三级数据库上机考试试题
- leetcode 4 --- 寻找两个有序数组的中位数
- supermap iserver java 6r许可_SuperMap iserver Java 6R 在 linux 上安装和配置 | 学步园
- python罗马数字转换,Python3.5实现的罗马数字转换成整数功能示例
- java如何把png转换成jpg_Java实现将png格式图片转换成jpg格式图片的方法【测试可用】...
- ue4中在物体上加ui_UE4 物体位置同步相关源码分析浅谈
- 计算机一级b考试教程,全国计算机等级考试一级B教程
- 因为瘟疫,英国诞生了一个又一个的科学家