分享

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

pig2 2019-1-30 20:53:52 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 4329
本帖最后由 pig2 于 2019-1-31 17:00 编辑

问题导读

1.输出模式包含哪两种?
2.输出行的schema包含哪些列?
3.什么是模式变量?

上一篇:彻底明白Flink系统学习29-1:【Flink1.7】流概念之模式检测
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26674


输出模式
输出模式描述了每次找到的匹配应该发出的行数。 SQL标准描述了两种模式:
  • 每次匹配所有行(ALL ROWS PER MATCH)
  • 每次匹配一行(ONE ROW PER MATCH)

目前,唯一支持的输出模式是ONE ROW PER MATCH,它将始终为每个找到的匹配生成一个输出概要行。

输出行的schema,按照特定顺序显示[partitioning 列] + [measures 列]

以下示例显示定义为以下内容的查询的输出:
[mw_shl_code=sql,true]SELECT *
FROM Ticker
    MATCH_RECOGNIZE(
        PARTITION BY symbol
        ORDER BY rowtime
        MEASURES
            FIRST(A.price) AS startPrice,
            LAST(A.price) AS topPrice,
            B.price AS lastPrice
        ONE ROW PER MATCH
        PATTERN (A+ B)
        DEFINE
            A AS LAST(A.price, 1) IS NULL OR A.price > LAST(A.price, 1),
            B AS B.price < LAST(A.price)
    )[/mw_shl_code]

下面是输入内容:
[mw_shl_code=bash,true] symbol   tax   price          rowtime
======== ===== ======== =====================
XYZ      1     10       2018-09-17 10:00:02
XYZ      2     12       2018-09-17 10:00:03
XYZ      1     13       2018-09-17 10:00:04
XYZ      2     11       2018-09-17 10:00:05[/mw_shl_code]

输出内容:
[mw_shl_code=bash,true] symbol   startPrice   topPrice   lastPrice
======== ============ ========== ===========
XYZ      10           13         11[/mw_shl_code]

模式识别由symbol列分区。 即使未在MEASURES子句中明确提及,也会在结果的开头添加分区列。

模式导航
DEFINE和MEASURES子句允许导航(Navigation)内(列表)行匹配模式

这部分讨论声明条件或产生输出结果导航

模式变量引用
模式变量引用允许一组行映射一个特定的模式变量引用在 DEFINE或则MEASURES子句中。

例如,表达式A.price描述了到目前为止映射到A的行集加上当前行,如果我们尝试将当前行与A匹配.

表达式A.price描述了如果我们尝试当前行匹配到A,一组行映射到(目前为止)A+当前行。如果表达式在DEFINE/MEASURES子句中需要单行(即A.price或则 A.price > 10),它选择属于相应集合的最后一个值。

如果未指定模式变量(例如SUM(price)),则表达式引用默认模式变量*,该变量引用模式中的所有变量。 换句话说,它创建了到目前为止映射到任何变量加上当前行的所有行的列表。

例子:有关更全面的示例,可以查看以下模式和相应的条件:
[mw_shl_code=sql,true]PATTERN (A B+)
DEFINE
  A AS A.price > 10,
  B AS B.price > A.price AND SUM(price) < 100 AND SUM(B.price) < 80[/mw_shl_code]
下表描述了如何为每个传入事件评估这些条件。

该表包含以下列:
  • # -唯一标识列表中 [A.price]/[B.price]/[price].传入行的行标识符
  • price  - 传入行的price  。
  • [A.price] / [B.price] / [price]  - 描述在DEFINE子句中用于评估条件的行列表。
  • Classifier - 当前行的分类器,指示行映射到的模式变量。
  • A.price / B.price / SUM(价格)/ SUM(B.price) - 描述评估这些表达式后的结果。

#
price
Classifier
[A.price]
[B.price]
[price]
A.price
B.price
SUM(price)
SUM(B.price)
#110-> A#1--10---
#215-> B#1#2#1, #210152515
#320-> B#1#2, #3#1, #2, #310204535
#431-> B#1#2, #3, #4#1, #2, #3, #410317666
#535#1#2, #3, #4, #5#1, #2, #3, #4, #51035111101


从表中可以看出,第一行映射到模式变量A,后续行映射到模式变量B.但是,最后一行不满足B条件,因为所有映射行的总和SUM(价格)和 B中所有行的总和超过指定的阈值。

注意请注意,尚不支持SUM等聚合。 它们仅用于解释。

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





已有(2)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条