从朋友在的公司在使用阿里云,了解到 有一个不知道算不算是新的东西 叫cep。或者叫 blink cep 复杂事件处理
Flink。 CEP(Complex Event Processing)就是在无界事件流中检测事件模式,让我们掌握数据中重要的部分。flink CEP是在flink中实现的复杂事件处理库。
去阿里云 官网看了下 先复制一条sql 其实 代码 和sql 本质上 差不太多 不过是一个用 api 一个用 关键词罢了
flink cep maven 依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-cep-scala_2.11</artifactId>
<version>1.10.0</version>
</dependency>
具体的api 这里不做介绍 等着 下次用的时候 再看吧 估计和sql差不多。。
flink cep sql 用法
SELECT [ ALL | DISTINCT ]
{ * | projectItem [, projectItem ]* }
FROM tableExpression
[MATCH_RECOGNIZE (
[PARTITION BY {partitionItem [, partitionItem]*}]
[ORDER BY {orderItem [, orderItem]*}]
[MEASURES {measureItem AS col [, measureItem AS col]*}]
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS]
[AFTER MATCH SKIP]
PATTERN (patternVariable[quantifier] [ patternVariable[quantifier]]*) WITHIN intervalExpression
DEFINE {patternVariable AS patternDefinationExpression [, patternVariable AS patternDefinationExpression]*}
)];
前面简单的sql语法 不做解释
参数 | 说明 |
---|---|
PARTITION BY | 分区的列,可选项。 |
ORDER BY | 可指定多列,但是必须以EVENT TIME 列或者PROCESS TIME 列作为排序的首列,可选项。 |
MEASURES | 定义如何根据匹配成功的输入事件构造输出事件。 |
ONE ROW PER MATCH | 对于每一次成功的匹配,只会产生一个输出事件。 |
ONE ROW PER MATCH WITH TIMEOUT ROWS | 除了匹配成功的时候产生输出外,超时的时候也会产生输出。超时时间由PATTERN语句中的WITHIN语句定义。 |
ALL ROWS PER MATCH | 对于每一次成功的匹配,对应于每一个输入事件,都会产生一个输出事件。 |
ALL ROWS PER MATCH WITH TIMEOUT ROWS | 除了匹配成功的时候产生输出外,超时的时候也会产生输出。超时时间由PATTERN语句中的WITHIN语句定义。 |
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS] | 为可选项,默认为ONE ROW PER MATCH 。 |
AFTER MATCH SKIP TO NEXT ROW | 匹配成功之后,从匹配成功的事件序列中的第一个事件的下一个事件开始进行下一次匹配。 |
AFTER MATCH SKIP PAST LAST ROW | 匹配成功之后,从匹配成功的事件序列中的最后一个事件的下一个事件开始进行下一次匹配。 |
AFTER MATCH SKIP TO FIRST patternItem | 匹配成功之后,从匹配成功的事件序列中第一个对应于patternItem的事件开始进行下一次匹配。 |
AFTER MATCH SKIP TO LAST patternItem | 匹配成功之后,从匹配成功的事件序列中最后一个对应于patternItem的事件开始进行下一次匹配。 |
PATTERN | 定义待识别的事件序列需要满足的规则,需要定义在() 中,由一系列自定义的patternVariable构成。 |
照抄官方文档解释, 还有一个 DEFINE 定义在PATTERN中出现的patternVariable的具体含义,如果某个patternVariable在DEFINE中没有定义,则认为对于每一个事件,该patternVariable都成立。 也就是 定义 事件的成功条件。下面是一个官方的例子
CREATE TABLE datahub_stream (
`timestamp` TIMESTAMP,
card_id VARCHAR,
location VARCHAR,
`action` VARCHAR,
WATERMARK wf FOR `timestamp` AS withOffset(`timestamp`, 1000)
) WITH (
type = 'datahub'
...
);
CREATE TABLE rds_out (
start_timestamp TIMESTAMP,
end_timestamp TIMESTAMP,
card_id VARCHAR,
event VARCHAR
) WITH (
type= 'rds'
...
);
--定义计算逻辑。
insert into rds_out
select
`start_timestamp`,
`end_timestamp`,
card_id, `event`
from datahub_stream
MATCH_RECOGNIZE (
PARTITION BY card_id --按card_id分区,将相同卡号的数据分到同一个计算节点上。
ORDER BY `timestamp` --在窗口内,对事件时间进行排序。
MEASURES --定义如何根据匹配成功的输入事件构造输出事件。
e2.`action` as `event`,
e1.`timestamp` as `start_timestamp`, --第一次的事件时间为start_timestamp。
LAST(e2.`timestamp`) as `end_timestamp` --最新的事件时间为end_timestamp。
ONE ROW PER MATCH --匹配成功输出一条。
AFTER MATCH SKIP TO NEXT ROW --匹配后跳转到下一行。
PATTERN (e1 e2+) WITHIN INTERVAL '10' MINUTE --定义两个事件,e1和e2。
DEFINE --定义在PATTERN中出现的patternVariable的具体含义。
e1 as e1.action = 'Consumption', --事件一的action标记为Consumption。
e2 as e2.action = 'Consumption' and e2.location <> e1.location --事件二的action标记为Consumption,且事件一和事件二的location不一致。
);