怎么做兼职网站吗,美客多跨境电商平台,python做网站比php好,网站外包谁报价1. 为什么要用 MATCH_RECOGNIZE
在流式场景里#xff0c;“找一段事件序列模式”是高频需求#xff1a;比如 A→B→C 的业务链路、连续下降后反弹的价格走势、登录失败多次后成功等。
Flink 本身有 CEP#xff08;Complex Event Processing#xff09;库用于模式检测“找一段事件序列模式”是高频需求比如A→B→C的业务链路、连续下降后反弹的价格走势、登录失败多次后成功等。Flink 本身有 CEPComplex Event Processing库用于模式检测同时 Flink SQL 也提供了更“关系化”的表达方式用MATCH_RECOGNIZE在 SQL 里描述复杂事件模式。Flink 文档明确指出该能力内部基于 Flink CEP 实现并且 Flink 的MATCH_RECOGNIZE是 SQL 行模式识别标准能力的一部分子集。(Apache Nightlies)标准背景SQL 的行模式识别Row Pattern Recognition在 SQL:2016 进入标准体系ISO/IEC 19075-5 对其语义与语法做了规范包括MATCH_RECOGNIZE。(國際標準組織)2. 依赖与使用方式2.1 在 Maven 工程中使用需要引入 flink-cepFlink 文档说明要在工程里用MATCH_RECOGNIZE需要把flink-cep加到依赖里。(Apache Nightlies)dependencygroupIdorg.apache.flink/groupIdartifactIdflink-cep/artifactIdversion2.2.0/version/dependency版本建议和你集群/依赖的 Flink 主版本保持一致上面示例是 2.2.0。(Maven Central)2.2 SQL Client 里用通常不需要额外操作Flink 文档也提到在 Flink SQL Client 中使用MATCH_RECOGNIZE默认依赖已包含。(Apache Nightlies)3. MATCH_RECOGNIZE 语法骨架7 个核心子句一条MATCH_RECOGNIZE查询通常由以下子句组成(Apache Nightlies)PARTITION BY按键分区类似聚合的 group by 语义ORDER BY指定事件顺序模式依赖顺序MEASURES定义输出字段类似 selectONE ROW PER MATCH每次匹配输出几行Flink 重点支持这一种(Apache Nightlies)AFTER MATCH SKIP控制下一次匹配从哪开始避免/允许重叠匹配(Apache Nightlies)PATTERN用“类正则”表达模式A B C、A B C* 等(Apache Nightlies)DEFINE定义模式变量 A/B/C 各自满足的条件(Apache Nightlies)4. 非常关键的 SQL 语义与限制不看会踩坑4.1 只能作用在 Append 表并且输出也是 Append 表Flink 文档明确写了 “Attention”MATCH_RECOGNIZE只能应用到 append table并且结果也始终是 append table。(Apache Nightlies)这意味着如果你的上游是更新流Upsert/Changelog直接用可能不被支持结果下游一般按 append sink 思路处理不依赖更新/撤回语义。4.2 强烈建议写 PARTITION BY否则可能退化成非并行算子如果不分区为了保证全局有序MATCH_RECOGNIZE可能会被翻译成非并行算子性能直接崩。Flink 文档对此有明确建议强烈建议 partition incoming data。(Apache Nightlies)4.3 ORDER BY 的第一排序键必须是时间属性且升序Flink 解释了 ORDER BY 的约束它假定ORDER BY的第一个参数是time attribute 且 ASC比如ORDER BY rowtime ASC, price DESC可以但ORDER BY price, rowtime或ORDER BY rowtime DESC, ...不行。(Apache Nightlies)5. 一个“最小可用”示例匹配 A→B→C 三段事件SELECTT.aid,T.bid,T.cidFROMMyTable MATCH_RECOGNIZE(PARTITIONBYuseridORDERBYproctime MEASURES A.idASaid,B.idASbid,C.idAScid ONEROWPERMATCHAFTERMATCHSKIP PASTLASTROWPATTERN(A B C)DEFINE AASnamea,BASnameb,CASnamec)AST;这一类写法的价值把原来 CEP 里的状态机逻辑直接用 SQL 的“模式变量 类正则 PATTERN 规则 DEFINE”写出来。(Apache Nightlies)6. 实战例子识别“持续下跌后反弹”的股票价格区间Flink 官方示例找出某个股票价格连续下降一个或多个 PRICE_DOWN最后出现一次PRICE_UP的区间并输出区间起点、最低点、终点。(Apache Nightlies)SELECT*FROMTicker MATCH_RECOGNIZE(PARTITIONBYsymbolORDERBYrowtime MEASURES START_ROW.rowtimeASstart_tstamp,LAST(PRICE_DOWN.rowtime)ASbottom_tstamp,LAST(PRICE_UP.rowtime)ASend_tstamp ONEROWPERMATCHAFTERMATCHSKIPTOLASTPRICE_UP PATTERN(START_ROW PRICE_DOWNPRICE_UP)DEFINE PRICE_DOWNAS(LAST(PRICE_DOWN.price,1)ISNULLANDPRICE_DOWN.priceSTART_ROW.price)ORPRICE_DOWN.priceLAST(PRICE_DOWN.price,1),PRICE_UPASPRICE_UP.priceLAST(PRICE_DOWN.price,1))MR;你可以重点学这 3 个技巧PRICE_DOWN表示至少一次类正则量词(Apache Nightlies)LAST(var.col, 1)在 DEFINE 中引用“上一个满足该变量条件的行”做对比实现“越来越小/越来越大”(Apache Nightlies)AFTER MATCH SKIP TO LAST PRICE_UP控制下一次匹配从哪里开始避免一次下跌区间被过度拆分/重叠 (Apache Nightlies)7. 已知限制Flink 只是标准子集常见不支持点Flink 文档的 Known Limitations 中明确提到一些 SQL 标准里的模式表达能力当前不支持例如(Apache Nightlies)Pattern groups不能对一个子序列整体加量词比如(A (B C))不合法Alterations不支持|这种分支模式如PATTERN((A B | C D) E)此外还有一个非常实用的提醒MATCH_RECOGNIZE不会使用你配置的 state retention time如果你担心状态无限增长需要用WITHIN来限制匹配窗口。(Apache Nightlies)8. 生产建议清单直接照做少走弯路一定写PARTITION BY按 userId / deviceId / symbol 等避免退化成非并行全局排序。(Apache Nightlies)ORDER BY第一列用时间属性且 ASC必要时第二列再按业务字段辅助排序。(Apache Nightlies)用AFTER MATCH SKIP ...明确你的“是否允许重叠匹配”的策略。(Apache Nightlies)模式可能长时间不闭合时用WITHIN控状态否则状态可能积压。(Apache Nightlies)记住它只能吃 append 表、产出 append 表链路上游/下游要匹配这个语义。(Apache Nightlies)