本帖最后由 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) | #1 | 10 | -> A | #1 | - | - | 10 | - | - | - | #2 | 15 | -> B | #1 | #2 | #1, #2 | 10 | 15 | 25 | 15 | #3 | 20 | -> B | #1 | #2, #3 | #1, #2, #3 | 10 | 20 | 45 | 35 | #4 | 31 | -> B | #1 | #2, #3, #4 | #1, #2, #3, #4 | 10 | 31 | 76 | 66 | #5 | 35 | | #1 | #2, #3, #4, #5 | #1, #2, #3, #4, #5 | 10 | 35 | 111 | 101
|
从表中可以看出,第一行映射到模式变量A,后续行映射到模式变量B.但是,最后一行不满足B条件,因为所有映射行的总和SUM(价格)和 B中所有行的总和超过指定的阈值。
注意请注意,尚不支持SUM等聚合。 它们仅用于解释。
最新经典文章,欢迎关注公众号
|
|