pig2 发表于 2019-1-30 20:53:52

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

本帖最后由 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,按照特定顺序显示 +

以下示例显示定义为以下内容的查询的输出:
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)
    )

下面是输入内容:
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

输出内容:
symbol   startPrice   topPrice   lastPrice
======== ============ ========== ===========
XYZ      10         13         11

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

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

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

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

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

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

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

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

该表包含以下列:

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


#priceClassifierA.priceB.priceSUM(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等聚合。 它们仅用于解释。

最新经典文章,欢迎关注公众号
http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg



jiewuzhe02 发表于 2019-1-31 13:17:11

关注学习

美丽天空 发表于 2019-2-2 23:42:56

感谢分享
页: [1]
查看完整版本: 彻底明白Flink系统学习29-2:【Flink1.7】流概念之模式检测