分享

彻底明白Flink系统学习29-4:【Flink1.7】流概念之模式检测

pig2 2019-2-1 16:20:17 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 5128
本帖最后由 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中没有等价物。



最新经典文章,欢迎关注公众号





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条