Flink CEP学习

文档持续更新嘞

Flink CEP简单入门

-- 代码来源于VVP提供模板
-- 个人感觉官网其实说的很清楚嘞,其实缺少一个数据生成的流推动吧
--********************************************************************--
-- Author:         sukang
-- Created Time:   2023-09-07 14:02:04
-- Description:    cep test
-- Hints:          You can use SET statements to modify the configuration
--********************************************************************--
--********************************************************************--
-- Flink SQL 快速入门示例 模式检测CEP
-- https://nightlies.apache.org/flink/flink-docs-release-1.17/zh/docs/dev/table/sql/queries/match_recognize/
-- 该模版仅支持使用"执行"功能。如需"上线"运行,需要您增加 INSERT 相关逻辑
--********************************************************************--
CREATE TEMPORARY TABLE subscriptions ( 
    id STRING,
    user_id INT,
    type STRING,
    start_date TIMESTAMP(3),
    end_date TIMESTAMP(3),
    payment_expiration TIMESTAMP(3),
    proc_time AS PROCTIME()
) WITH (
  'connector' = 'faker',    -- Faker 连接器仅在 VVR-4.0.12 及以上支持
  'fields.id.expression' = '#{Internet.uuid}', 
  'fields.user_id.expression' = '#{number.numberBetween ''1'',''50''}',
  'fields.type.expression'= '#{regexify ''(basic|premium|platinum){1}''}',
  'fields.start_date.expression' = '#{date.past ''30'',''DAYS''}',
  'fields.end_date.expression' = '#{date.future ''15'',''DAYS''}',
  'fields.payment_expiration.expression' = '#{date.future ''365'',''DAYS''}'
);

SELECT * 
FROM subscriptions
    MATCH_RECOGNIZE ( -- 按user_id分区,按处理时间proc_time升序排序
        PARTITION BY user_id 
        ORDER BY proc_time

        -- 匹配到输出的内容
        MEASURES
            LAST(PREMIUM.type) AS premium_type,
            AVG(TIMESTAMPDIFF(DAY,PREMIUM.start_date,PREMIUM.end_date)) AS premium_avg_duration,
            BASIC.start_date AS downgrade_date
        -- 指定下一个匹配的开始位置;
        -- 匹配到了,判断结束后从什么地方再次匹配
        
        AFTER MATCH SKIP PAST LAST ROW 

        -- 匹配模式 a事件发生后, 出现了b事件,就规则判定
        PATTERN (PREMIUM+ BASIC) 
        -- 约束时间,优化状态嘞
        -- WITHIN INTERVAL '1' HOUR
        -- 定义规则,比如,预期是[a,b]内  多个条件利用逗号隔开
        DEFINE PREMIUM AS PREMIUM.type IN ('premium','platinum'),
            BASIC AS BASIC.type = 'basic'
            );


/*
PARTITION BY - 定义表的逻辑分区;类似于 GROUP BY 操作。
ORDER BY - 指定传入行的排序方式;这是必须的,因为模式依赖于顺序。
MEASURES - 定义子句的输出;类似于 SELECT 子句。
ONE ROW PER MATCH - 输出方式,定义每个匹配项应产生多少行。
    ALL ROWS PER MATCH
ONE ROW PER MATCH
AFTER MATCH SKIP - 指定下一个匹配的开始位置;这也是控制单个事件可以属于多少个不同匹配项的方法。
    SKIP PAST LAST ROW - 在当前匹配的最后一行之后的下一行继续模式匹配。
    SKIP TO NEXT ROW - 继续从匹配项开始行后的下一行开始搜索新匹配项。
    SKIP TO LAST variable - 恢复映射到指定模式变量的最后一行的模式匹配。
    SKIP TO FIRST variable - 在映射到指定模式变量的第一行继续模式匹配。
PATTERN - 允许使用类似于 正则表达式 的语法构造搜索的模式。
DEFINE - 本部分定义了模式变量必须满足的条件。
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值