本帖最后由 pig2 于 2019-2-1 16:21 编辑
问题导读
1.匹配模式有哪些匹配策略?
2.MATCH_RECOGNIZE子句是否可以使用已配置的状态保留时间?
3.匹配模式有哪些不支持?
上一篇:
彻底明白Flink系统学习29-3:【Flink1.7】流概念之模式检测
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26694
匹配策略后
AFTER MATCH SKIP子句指定在找到完整匹配后开始新匹配过程的位置。
有四种不同的策略:
- SKIP PAST LAST ROW - 在当前匹配的最后一行之后的下一行恢复模式匹配。
- SKIP TO NEXT ROW - 继续在匹配的起始行之后的下一行开始搜索新的匹配。
- SKIP TO LAST variable - 在映射到指定模式变量的最后一行恢复模式匹配。
- SKIP TO FIRS variable - 在映射到指定模式变量的第一行恢复模式匹配。
这也是一种指定单个事件可以属于多少匹配的方法。 例如,使用SKIP PAST LAST ROW策略,每个事件最多只能属于一个匹配项。
例子:
为了更好地理解这些策略之间的差异,可以查看以下示例。
对于以下输入行:
[mw_shl_code=bash,true] symbol tax price rowtime
======== ===== ======= =====================
XYZ 1 7 2018-09-17 10:00:01
XYZ 2 9 2018-09-17 10:00:02
XYZ 1 10 2018-09-17 10:00:03
XYZ 2 5 2018-09-17 10:00:04
XYZ 2 17 2018-09-17 10:00:05
XYZ 2 14 2018-09-17 10:00:06[/mw_shl_code]
我们使用不同的策略评估以下查询:
[mw_shl_code=sql,true]SELECT *
FROM Ticker
MATCH_RECOGNIZE(
PARTITION BY symbol
ORDER BY rowtime
MEASURES
SUM(A.price) AS sumPrice,
FIRST(rowtime) AS startTime,
LAST(rowtime) AS endTime
ONE ROW PER MATCH
[AFTER MATCH STRATEGY]
PATTERN (A+ C)
DEFINE
A AS SUM(A.price) < 30
)[/mw_shl_code]
查询返回映射到A的所有行的价格总和以及整个匹配的第一个和最后一个时间戳。
请注意,尚不支持SUM等聚合。 它们仅用于解释。
查询将根据使用的AFTER MATCH策略产生不同的结果:
AFTER MATCH SKIP PAST LAST ROW
[mw_shl_code=bash,true] symbol sumPrice startTime endTime
======== ========== ===================== =====================
XYZ 26 2018-09-17 10:00:01 2018-09-17 10:00:04
XYZ 17 2018-09-17 10:00:05 2018-09-17 10:00:06[/mw_shl_code]
第一个结果与行#1,#2,#3,#4匹配。
第二个结果与第5行,第6行匹配。
AFTER MATCH SKIP TO NEXT ROW
[mw_shl_code=bash,true] symbol sumPrice startTime endTime
======== ========== ===================== =====================
XYZ 26 2018-09-17 10:00:01 2018-09-17 10:00:04
XYZ 24 2018-09-17 10:00:02 2018-09-17 10:00:05
XYZ 15 2018-09-17 10:00:03 2018-09-17 10:00:05
XYZ 22 2018-09-17 10:00:04 2018-09-17 10:00:06
XYZ 17 2018-09-17 10:00:05 2018-09-17 10:00:06[/mw_shl_code]
同样,第一个结果与行#1,#2,#3,#4匹配。
与先前的策略相比,下一个匹配包括再次用于下一个匹配的行#2。 因此,第二个结果与行#2,#3,#4,#5匹配。
第三个结果与第3行,第4行,第5行匹配。
第四个结果与第4行,第5行,第6行相匹配。
最后一个结果与第5行,第6行匹配。
AFTER MATCH SKIP TO LAST A
[mw_shl_code=bash,true] symbol sumPrice startTime endTime
======== ========== ===================== =====================
XYZ 26 2018-09-17 10:00:01 2018-09-17 10:00:04
XYZ 15 2018-09-17 10:00:03 2018-09-17 10:00:05
XYZ 22 2018-09-17 10:00:04 2018-09-17 10:00:06
XYZ 17 2018-09-17 10:00:05 2018-09-17 10:00:06[/mw_shl_code]
同样,第一个结果与行#1,#2,#3,#4匹配。
与之前的策略相比,下一个匹配仅包括第3行(映射到A)以进行下一次匹配。 因此,第二个结果与行#3,#4,#5匹配。
第三个结果与第4行,第5行,第6行匹配。
最后一个结果与第5行,第6行匹配。
AFTER MATCH SKIP TO FIRST A
此组合将产生运行时异常,因为总是会尝试启动最后一个匹配的新匹配。 这将产生无限循环,因此被禁止。
必须记住,在SKIP TO FIRST / LAST变量策略的情况下,可能没有行映射到该变量(例如,对于模式A *)。 在这种情况下,将抛出运行时异常,因为标准需要有效行来继续匹配。
控制内存消耗
在编写MATCH_RECOGNIZE查询时,内存消耗是一个重要的考虑因素,因为潜在匹配的空间是以类似于广度的方式构建的。 考虑到这一点,必须确保模式可以完成。 优选地,具有映射到匹配的合理数量的行,因为它们必须适合内存。
例如,模式不能有没有上限的量词,接受访问每个单行(row).。 这样的模式可能如下所示:
[mw_shl_code=sql,true]PATTERN (A B+ C)
DEFINE
A as A.price > 10,
C as C.price > 20[/mw_shl_code]
查询将每个传入的行映射到B变量,因此永远不会完成。 该查询可以是固定的,例如,通过否定C的条件:
[mw_shl_code=sql,true]PATTERN (A B+ C)
DEFINE
A as A.price > 10,
B as B.price <= 20,
C as C.price > 20[/mw_shl_code]
或者通过使用不情愿的(reluctant)量词:
[mw_shl_code=sql,true]PATTERN (A B+? C)
DEFINE
A as A.price > 10,
C as C.price > 20[/mw_shl_code]
请注意,MATCH_RECOGNIZE子句不使用已配置的状态保留时间( state retention time)。 截至目前,也没有可能在模式上定义时间限制,因为在SQL标准中没有这种可能性。 社区正在为该功能设计正确的语法。
已知限制
Flink的MATCH_RECOGNIZE子句的实现是一项持续的工作,并且还不支持SQL标准的某些功能。
不支持的功能包括:
- 模式组(Pattern groups) - 这意味着例如量词不能应用于模式的子序列。因此,(A(B C)+)不是有效模式。
- 改变(Alterations)- 像PATTERN((A B | C D)E)这样的模式,这意味着在寻找E行之前必须找到子序列A B或C D.
- PERMUTE运算符 - 相当于它应用于的所有变量的排列。模式(PERMUTE(A,B,C))= PATTERN(A B C | A C B | B A C | B C A | C A B | C B A)。
- Anchors - ^,$,表示分区的开始/结束,那些在流上下文中没有意义,并且不受支持。
- 排除(Exclusion) - PATTERN({ - A - } B)意味着将查找A但不参与输出。这仅适用于ALL ROWS PER MATCH模式。
- 不情愿的(Reluctant)可选量词 - PATTERN A??只支持贪婪的可选(greedy)量词。
- ALL ROWS PER MATCH输出模式 - 为参与创建匹配的每一行产生输出行。这也意味着:
- MEASURES子句唯一支持的语义是FINAL
- 尚未支持CLASSIFIER函数,该函数返回行映射到的模式变量。
- SUBSET - 允许创建模式变量的逻辑组并在DEFINE和MEASURES子句中使用这些组。
- 物理偏移(Physical offsets) - PREV / NEXT,它对所有看到的事件进行索引,而不仅仅是那些映射到模式变量的事件(如在逻辑偏移情况下)。
- 提取(Extracting)时间属性 - 目前无法为后续基于时间的操作获取时间属性。
- 聚合 - 在MEASURES和DEFINE子句中不能使用聚合。
- 用户定义的函数不能在MATCH_RECOGNIZE中使用。
- 仅支持SQL MATCH_RECOGNIZE。表API中没有等价物。
最新经典文章,欢迎关注公众号
|
|