Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >flink cep

flink cep

作者头像
IT云清
发布于 2022-08-07 04:52:26
发布于 2022-08-07 04:52:26
54200
代码可运行
举报
文章被收录于专栏:IT云清IT云清
运行总次数:0
代码可运行

1.cep适合做什么

CEP: Complex Event Processing缩写,复杂事件处理。

CEP是一种事件流上的模式匹配技术,与传统的先存储后查询数据的方式不同:CEP预先设置查询条件,然后让实时数据通过这些查询条件,引擎抓取符合条件的数据,这种查询是连续不断的,连续到达的事件与提前定义好的复杂模式进行匹配,然后输出满足复杂模式的事件。

CEP用于分析低延迟、频繁产生的不同来源的事件流,可以做到感知(实时事件的检测)、分析(聚合各类事件)、响应(更新预期);

2.flink cep基本概念与使用流程:

Flink CEP内部是用NFA(非确定有限自动机)来实现的,由点和边组成的一个状态图,以一个初始状态作为起点,经过一系列的中间状态,达到终态。

点分为起始状态、中间状态、最终状态三种,边分为take、ignore、proceed三种。

take:必须存在一个条件判断,当到来的消息满足take边条件判断时,把这个消息放入结果集,将状态转移到下一状态。 ignore:当消息到来时,可以忽略这个消息,将状态自旋在当前不变,是一个自己到自己的状态转移。 proceed:又叫做状态的空转移,当前状态可以不依赖于消息到来而直接转移到下一状态。

flink cep的使用,核心分为2个部分:定义事件模式,匹配结果处理;

1.模式pattern

模式可以理解为,事件流中,某个事件具有的某个特征,或者某种行为模式,或者处理事件的规则。

模式定义好后用来提取事件流中符合模式规则的事件序列。当源源不断的事件流经过时,只有符合我们定义的复杂模式的事件,才会被提取处理。

个体模式:一个单独的模式定义,即为一个个体模式。

组合模式:多个个体模式组合起来形成一个组合模式。也叫模式序列;模式序列必须以一个初始序列开始;

模式组:将一个模式序列作为条件嵌套在个体模式里;待定。

个体模式又分为:单例(singleton)模式,循环(looping)模式

单例模式接收单个事件,循环模式可以接收多个事件。

每个模式,可以有一个或者多个条件,模式基于条件接受事件。

2.条件condition

1.个体模式条件

每个模式都要指定触发条件,作为模式是否接受事件进入结果集的判断依据。

当事件进入模式进行匹配时,如果事件不满足当前模式的条件,则事件会被丢弃,否则会加入到当前模式对应的缓存结果集中,或者流入下一个模式,进行后续匹配。

单个模式条件主要通过:.where() .or() .until来指定条件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pattern<TradeEvent, TradeEvent> pattern = Pattern.<TradeEvent>begin("start")
.where(new SimpleCondition<TradeEvent>() { //where 可以有多个,相当于and
    @Override
    public boolean filter(TradeEvent tradeEvent) throws Exception {
        return tradeEvent.getAccountName().equals("张三") ;
    }
}).or(new SimpleCondition<TradeEvent>() { //or
    @Override
    public boolean filter(TradeEvent tradeEvent) throws Exception {
        return tradeEvent.getAccountName().equals("李四");
    }
}).where(new IterativeCondition<TradeEvent>() { //迭代条件
    @Override
    public boolean filter(TradeEvent tradeEvent, Context<TradeEvent> context) throws Exception {
        Iterable<TradeEvent> start = context.getEventsForPattern("start"); //能够对模式之前所接受的所有事件进行处理
        return tradeEvent.getDealTime().before(new Date(tradeEvent.getOpenDate().getTime() + 30 * ONE_DAY_LONG));
    }
}).until(new SimpleCondition<TradeEvent>() { //终止条件
    @Override
    public boolean filter(TradeEvent tradeEvent) throws Exception {
        return tradeEvent.getTradeType().equals("扣息");
    }
}).within(Time.hours(1));//1小时以内 为模式指定事件约束,在多久内匹配有效。

2.模式序列条件

模式序列的条件有3种:

严格临近 Strict Contiguity:要求一个event之后必须紧跟下一个符合条件的event,中间不允许有其他事件。对应.next(); 宽松临近Relaxed Contiguity:和上一种不同的是,该模式允许中间有其他无关的event,会对他们进行忽略。对应.followedBy(); 非确定性宽松临近 Non-Deterministic Relaxed Contiguity:非确定性宽松连续性,可以对已经匹配的事件就行忽略,对接下来的事件继续匹配。对应.followedByAny() 3.匹配之后的跳过策略 在给定的pattern中,当同一事件符合多种模式条件组合之后,需要执行AfterMatchSkipStrategy来确定到底输出哪种匹配。主要有4中策略:

1 NO_SKIP 输出所有可能匹配的事件进行输出,不忽略任何一条

2 SKIP_PAST_LAST_EVENT. 忽略开始触发到当前触发pattern的所有部分匹配。只保留最近的匹配

3 SKIP_TO_FIRST[patternName]。忽略第一个匹配指定patternName的pattern之前的所有部分匹配。保留第一个匹配 和 第一个能够匹配patternName之后的所有匹配,

4 SKIP_TO_LAST[patternName]。忽略第一个匹配和 最后一个匹配PatternName 之间的所有部分匹配。 保留第一个匹配 和最后一个能匹配PatternName的匹配,只保留2个

5 SKIP_TO_NEXT. 忽略所有部分和第一个匹配有同样开始的匹配。保留第一个匹配,以后后面不和第一个匹配有同样开始的匹配

3.模式检测

当定义好模式和事件流后,指定输入流和模式,当有事件到达时,即可开始匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PatternStream<TradeEvent> patternStream = CEP.pattern(source, pattern);//给定的输入流指定模式

4.匹配事件提取

创建了PatternStream后,就可以从符合模式序列的事件序列中提取事件了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SingleOutputStreamOperator<Object> process = patternStream.process(new PatternProcessFunction<TradeEvent, Object>() {
    @Override
    public void processMatch(Map<String, List<TradeEvent>> map, Context context, Collector<Object> collector) throws Exception {
        for (Map.Entry<String, List<TradeEvent>> entry : map.entrySet()) {
            //key是模式的名称,value是此模式下接收的所有的事件
            logger.info("##########结果为 key={},value={}",entry.getKey(),entry.getValue().toString());
        }
    }
});

由于模式中可以指定超时时间,部分事件序列可能会因为超过时间窗口长度而被丢弃。这一部分根据具体业务可能还需要指定超时时间处理程序。

5.案例

1.事件序列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new TradeEvent(2,"张三","一类账户","充值",40.00,openDate1,dateFormat.parse("2022-04-04 12:03:00")),
new TradeEvent(3,"张三","一类账户","购买",30.00,openDate1,dateFormat.parse("2022-04-04 12:04:00")),
new TradeEvent(6,"李四","一类账户","登陆",0.00,openDate1,dateFormat.parse("2022-04-04 13:00:00")),
new TradeEvent(7,"李四","一类账户","充值",40.00,openDate1,dateFormat.parse("2022-04-04 13:02:00")),
new TradeEvent(8,"李四","一类账户","充值",21.00,openDate1,dateFormat.parse("2022-04-04 13:03:00")),
new TradeEvent(9,"王二","一类账户","充值",60.00,openDate1,dateFormat.parse("2022-04-04 13:03:00")),
new TradeEvent(10,"王二","一类账户","购买",60.00,openDate1,dateFormat.parse("2022-04-04 13:03:00")),
new TradeEvent(11,"李四","一类账户","购买",30.00,openDate1,dateFormat.parse("2022-04-04 13:04:00")),
new TradeEvent(12,"李四","一类账户","送礼",30.00,openDate1,dateFormat.parse("2022-04-04 13:06:00")),
new TradeEvent(13,"李四","一类账户","送礼",10.00,openDate1,dateFormat.parse("2022-04-04 13:08:00")),
new TradeEvent(4,"张三","一类账户","送礼",30.00,openDate1,dateFormat.parse("2022-04-04 12:06:00")),
new TradeEvent(5,"张三","一类账户","送礼",10.00,openDate1,dateFormat.parse("2022-04-04 12:08:00")),
new TradeEvent(14,"张三","一类账户","退出",0.00,openDate1,dateFormat.parse("2022-04-04 12:10:00"))

2.基础配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 //账户在登录后,马上进行充值(5分钟),充值后立马买礼物(5分钟),买完立即送人(5分钟),且充值金额与送礼金额接近。
DataStream<TradeEvent> source = env.fromElements(eventList)
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<TradeEvent>(Time.milliseconds(500L)) {
    @Override
    public long extractTimestamp(TradeEvent payEvent) {
        //时间戳,这里选择了TradeEvent对象内部的时间字段,则状态机接收事件时,时间的先后顺序以TradeEvent中的dealTime判断
        return payEvent.getDealTime().getTime();
    }
}).keyBy(new KeySelector<TradeEvent, Object>() {
    @Override
    public Object getKey(TradeEvent value) throws Exception {
        //用accountName分区 每个accountName都会有一个自己的NFA实例
        return value.getAccountName();
    }
});

3.模式定义

登陆->充值->购买->送礼 松散匹配,忽略之间不符合的事件。

超时之前/完全匹配之前,符合部分条件的数据,会常驻状态的结果集中(内存)。直到超时或者序列满足,才会被拿出处理/清理;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static Pattern<TradeEvent, TradeEvent> getPattern() {
    Pattern<TradeEvent, TradeEvent> pattern =
            Pattern.<TradeEvent>begin("登陆").where(new SimpleCondition<TradeEvent>() {
                @Override
                public boolean filter(TradeEvent tradeEvent) throws Exception {
                    return tradeEvent.getTradeType().equals("登陆") ;
                }
            }).followedBy("充值").where(new SimpleCondition<TradeEvent>() {
                @Override
                public boolean filter(TradeEvent tradeEvent) throws Exception {
                    return tradeEvent.getTradeType().equals("充值");
                }
            }).followedBy("购买").where(new SimpleCondition<TradeEvent>() {
                @Override
                public boolean filter(TradeEvent tradeEvent) throws Exception {
                    return tradeEvent.getTradeType().equals("购买");
                }
            }).followedBy("送礼1").where(new SimpleCondition<TradeEvent>() {
                @Override
                public boolean filter(TradeEvent tradeEvent) throws Exception {
                    return tradeEvent.getTradeType().equals("送礼");
                }
            }).followedBy("送礼2").where(new IterativeCondition<TradeEvent>(){
                @Override
                public boolean filter(TradeEvent value, Context<TradeEvent> ctx) throws Exception {
                    Iterable<TradeEvent> charge = ctx.getEventsForPattern("充值");
                    //关联处理 可以获取充值阶段的数据
                    return false;
                }
            }).times(1).within(Time.minutes(7));
    return pattern;
}

4.结果处理

1.打印出符合模式的事件序列中送礼的详细数据;

2.组装简单指标数据存储

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 SingleOutputStreamOperator<Object> outputStreamOperator = patternStream.process(new PatternProcessFunction<TradeEvent, Object>() {
 
        /**
         * 结果集数据获取
         * @param match
         * @param ctx
         * @param out
         * @throws Exception
         */
        @Override
        public void processMatch(Map<String, List<TradeEvent>> match, Context ctx, Collector<Object> out) throws Exception {
            //把符合模式序列的结果集中,送礼模式的结果集打印出来
            List<TradeEvent> songli = match.get("送礼");
            logger.info("##########送礼结果为:{}", songli.toString());
 
            songli.stream().forEach(event -> insertIndex(event.getAccountName()+"_登陆_充值_送礼_5min内",1));
            logger.info("--------------------\r\r\r");
        }
    });
    env.execute("execute");
    System.out.println("===============================");
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2022-04-26 17:58:19.573  INFO   --- [pOperator (1/1)] com.java4all.mycep.pattern.BasicPattern  : ##########送礼结果为:[TradeEvent{id=4, accountName='张三', accountType='一类账户', tradeType='送礼', tradeMoney=30.0, openDate=Fri Jan 01 00:00:00 CST 2021, dealTime=Mon Apr 04 00:06:00 CST 2022}]
2022-04-26 17:58:19.583  INFO   --- [pOperator (1/1)] com.java4all.mycep.pattern.BasicPattern  : 写入指标:key=张三_登陆_充值_送礼_5min内,value=1
 
2022-04-26 17:58:19.587  INFO   --- [pOperator (1/1)] com.java4all.mycep.pattern.BasicPattern  : ##########送礼结果为:[TradeEvent{id=12, accountName='李四', accountType='一类账户', tradeType='送礼', tradeMoney=30.0, openDate=Fri Jan 01 00:00:00 CST 2021, dealTime=Mon Apr 04 13:06:00 CST 2022}]
2022-04-26 17:58:19.588  INFO   --- [pOperator (1/1)] com.java4all.mycep.pattern.BasicPattern  : 写入指标:key=李四_登陆_充值_送礼_5min内,value=1

6.状态的结果集

NFA运行时,状态数据是保存在内存中的,通过内存队列存放半匹配和已匹配数据。源码如下,目前,未发现支持对接外部存储的拓展方式。

由于数据较多时,可能内存数据集较大,flinkcep 基于论文实现了一套数据结构

其中图a、b、c是原始的R1、R2、R3缓存,图d则是整合在一起的共享版本缓存。它会将所有序列的前向指针附加上一个版本号(采用杜威十进制法,点号分隔),并且遵循以下两个规则:

迁移到下一个状态时,版本号增加一位,如a[1]状态的版本号是1(为了符合习惯写作1.0),a[i]状态的版本号是1.0、1.1,b状态的版本号是1.0.0、1.1.0……以此类推;

当序列发生分裂时,处于当前状态的版本号位加1。例如e3事件产生了2.0版本,e6事件产生了1.1版本。

依照这种规则,就可以根据前向指针上版本号的递增规律和前缀来回溯出正确的序列了。Flink CEP中将此缓存设计为SharedBuffer类,但是版本的设计有些不同。

7.总结:

优点:

1.模式定义较为灵活,丰富的java api,方便开发;

2.量词,组合模式,连续策略,跳过策略等语义支持丰富;

缺点:

1.一个模式中不支持多个不同的时间窗口;

2.由于状态的结果集在内存中,难以支持超长时间窗口数据处理;

3.对标准的事件序列数据处理较好,其他回溯统计类难以处理;

4.无不发生算子;

5.新增模式困难;需要自研某种机制;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Apache Flink CEP 实战
本文根据 Apache Flink 系列直播课程整理而成,由哈啰出行大数据实时平台资深开发刘博分享。通过一些简单的实际例子,从概念原理,到如何使用,再到功能的扩展,希望能够给计划使用或者已经使用的同学一些帮助。
Spark学习技巧
2021/03/05
1.3K0
Apache Flink CEP 实战
Flink系列 - 实时数仓之CEP预警实战
CEP 即Complex Event Processing - 复杂事件,Flink CEP 是在 Flink 中实现的复杂时间处理(CEP)库。处理事件的规则,被叫做“模式”(Pattern),Flink CEP 提供了 Pattern API,用于对输入流数据进行复杂事件规则定义,用来提取符合规则的事件序列。
大数据真好玩
2021/01/26
1.6K0
Flink进阶-Flink CEP(复杂事件处理)
FlinkCEP是在Flink之上实现的复杂事件处理(CEP)库。 它允许你在×××的事件流中检测事件模式,让你有机会掌握数据中重要的事项。
王知无-import_bigdata
2019/06/19
16K2
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面(四)CEP篇
对于你喜欢的事想去做的事,你必须付出百分之一千的努力你知道这一路可能会有很多困难,会有坚持不下去想要放弃的时候也有时候,你不一定会得到你想要的结果,但你—定要相信。
857技术社区
2023/02/23
9850
Flink1.13架构全集| 一文带你由浅入深精通Flink方方面面(四)CEP篇
Flink动态CEP Demo
使用动态CEP处理数据,分别传入事件流和配置流,配置动态生成Pattern并再DynamicOperator生成状态机等待事件进入,匹配
sixjo
2023/05/18
8540
(5)Flink CEP SQL四种匹配模式效果演示
从匹配成功的事件序列中最后一个对应于patternItem的事件开始进行下一次匹配
NBI大数据
2022/08/24
5190
(5)Flink CEP SQL四种匹配模式效果演示
以直播平台监控用户弹幕为例详解 Flink CEP
我们在看直播的时候,不管对于主播还是用户来说,非常重要的一项就是弹幕文化。为了增加直播趣味性和互动性, 各大网络直播平台纷纷采用弹窗弹幕作为用户实时交流的方式,内容丰富且形式多样的弹幕数据中隐含着复杂的用户属性与用户行为, 研究并理解在线直播平台用户具有弹幕内容审核与监控、舆论热点预测、个性化摘要标注等多方面的应用价值。
五分钟学大数据
2021/04/29
1.7K0
以直播平台监控用户弹幕为例详解 Flink CEP
(2)Flink CEP SQL严格近邻代码演示-风控系统构建利器
上一篇我们对Flink CEP做了简单介绍,这一篇我们通过代码来演示一下Flink CEP SQL中的严格近邻效果:
NBI大数据
2022/08/13
4930
(2)Flink CEP SQL严格近邻代码演示-风控系统构建利器
FlinkCEP - Flink的复杂事件处理
FlinkCEP是在Flink上层实现的复杂事件处理库。 它可以让你在无限事件流中检测出特定的事件模型,有机会掌握数据中重要的那部分。
Spark学习技巧
2023/12/05
5970
FlinkCEP - Flink的复杂事件处理
flink cep 案例之机架温度监控报警
FlinkCEP是在Flink之上实现的复杂事件处理库。它提供了丰富的API,允许您在不停止的事件流中检测事件模式,并对复杂事件做相应处理。模式匹配是复杂事件处理的一个有力的保障,应用场景包括受一系列事件驱动的各种业务流程,例如在正常的网略行为中侦测异常行为;在金融应用中查找价格、交易量和其他行为的模式。
大数据技术与应用实战
2020/09/15
1K0
Flink CEP 原理和案例详解
(1)定义 复合事件处理(Complex Event Processing,CEP)是一种基于动态环境中事件流的分析技术,事件在这里通常是有意义的状态变化,通过分析事件间的关系,利用过滤、关联、聚合等技术,根据事件间的时序关系和聚合关系制定检测规则,持续地从事件流中查询出符合要求的事件序列,最终分析得到更复杂的复合事件。 (2)特征 CEP的特征如下: 目标:从有序的简单事件流中发现一些高阶特征; 输入:一个或多个简单事件构成的事件流; 处理:识别简单事件之间的内在联系,多个符合一定规则的简单事件构成复杂事件; 输出:满足规则的复杂事件。
王知无-import_bigdata
2020/08/20
8.2K0
Flink CEP 原理和案例详解
Flink-Cep实现规则动态更新
规则引擎通常对我们的理解就是用来做模式匹配的,在数据流里面检测满足规则要求的数据。有人会问为什么需要规则动态变更呢?直接修改了规则把服务重启一下不就可以了吗,这个当然是不行的,规则引擎里面通常会维护很多不同的规则,例如在监控告警的场景下,如果每个人修改一下自己的监控阈值,就重启一下服务,必然会影响其他人的使用,因此需要线上满足规则动态变更加载。本篇基于Flink-Cep 来实现规则动态变更加载,同时参考了Flink中文社区刘博老师的分享(https://developer.aliyun.com/article/738454),在这个分享里面是针对在处理流中每一个Key使用不同的规则,本篇的讲解将不区分key的规则。
Flink实战剖析
2022/04/18
1.9K0
Flink CEP学习线路指导1:Flink CEP入门
问题导读 1.Flink CEP是什么? 2.Flink CEP可以做哪些事情? 3.Flink CEP和流式处理有什么区别? 4.Flink CEP实现方式有哪些? Flink CEP在Flink里面还是比较难以理解的。有的老铁甚至以为和Flink流式处理是差不多的。其实Flink CEP跟流式处理确实有相似的地方。但是Flink CEP处理的是流式数据,但是却并不是流式处理(datastream)。后面给大家详细讲解。 Flink CEP有的大家甚至不知道CEP是什么?CEP在Flink未产生以前,已经有CEP,并不是有了Flink才有CEP,我们这里重点是讲Flink CEP。CEP本身的含义是复杂事件处理。那么它为什么可以处理复杂事件,这就跟它的原理有关系了。所以我们需要了解NFA,NFA是什么?它的含义是非确定有限自动状态机。我们明确它的概念是什么就可以了。后面同样也会给大家补充。 由于官网只讲了CEP的基础部分,因此我们需要给大家补充原理部分,基础(组成)部分,以及编程方面的内容。 也就是我们按照下面线路来学习: 1.首先认识Flink CEP 2.Flink CEP原理机制 3.Flink CEP编程 通过上面三部分,我们来学习Flink CEP。
用户1410343
2019/11/06
2.4K0
Flink CEP学习线路指导1:Flink CEP入门
全网最详细4W字Flink入门笔记(下)
Flink是一个有状态的流式计算引擎,所以会将中间计算结果(状态)进行保存,默认保存到TaskManager的堆内存中,但是当task挂掉,那么这个task所对应的状态都会被清空,造成了数据丢失,无法保证结果的正确性,哪怕想要得到正确结果,所有数据都要重新计算一遍,效率很低。想要保证 At -least-once 和 Exactly-once,需要把数据状态持久化到更安全的存储介质中,Flink提供了堆内内存、堆外内存、HDFS、RocksDB等存储介质。
BookSea
2023/10/16
1K0
全网最详细4W字Flink入门笔记(下)
零基础学Flink:CEP复杂事件处理
上一篇文章,我们介绍了UDF,可以帮用户自定义函数,从而在使用Flink SQL中,能够得心应手的处理一些数据问题。今天我们来学习一下Flink是如何处理CEP问题的。本文会分为两个部分,概念介绍部分和代码案例部分。
麒思妙想
2020/07/10
1.8K0
【Flink】基于 Flink 实时计算商品订单流失量
第三条规则可以理解为数据流去重,我在上一节已经介绍过了。为了更加专注于计算商品的订单流失量,本篇文章不再关注数据去重。
阿泽 Crz
2020/09/28
1.7K0
一个Flink-Cep使用案例
本篇主要演练使用Flink-Cep+Groovy+Aviator 来实现一个物联网监控规则中的一个场景案例,后续将会介绍如何实现规则动态变更。
Flink实战剖析
2022/04/18
1.7K0
基于 flink 的电商用户行为数据分析【8】| 订单支付实时监控
本篇是flink 的「电商用户行为数据分析」的第 8 篇文章,为大家带来的是市场营销商业指标统计分析之订单支付实时监控的内容!通过本期内容,我们可以实现通过使用CEP和Process Function来实现订单支付实时监控的功能,还能学会通过connect 和 join来实现flink双流join的功能,可谓干货满满!受益的朋友记得三连支持一下 ~
大数据梦想家
2021/01/27
3.2K0
基于 flink 的电商用户行为数据分析【8】| 订单支付实时监控
Flink学习笔记(10) - CEP
  一个或多个由简单事件构成的事件流通过一定的规则匹配,然后输出用户想得到的数据 —— 满足规则的复杂事件
挽风
2022/09/01
8720
Flink学习笔记(10) - CEP
FLINK实战-使用CEP进行网站监控报警和报警恢复
flink CEP(Complex event processing),是在Flink之上实现的复杂事件处理库,可以允许我们在不断的流式数据中通过我们自己定义的模式(Pattern)检测和获取出我们想要的数据,然后对这些数据进行下一步的处理。通过各种pattern的组合,我们可以定义出非常复杂的模式来匹配我们的数据。
大数据技术与应用实战
2020/09/15
1.9K0
相关推荐
Apache Flink CEP 实战
更多 >
LV.1
兰亮高级JAVA工程师
作者相关精选
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验