pig2 发表于 2019-1-31 19:34:48

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

本帖最后由 pig2 于 2019-2-1 16:20 编辑

问题导读

1.LAST函数作用是什么?
2.FIRST函数的作用是什么?
3.LAST和FIRST函数使用有哪些需要注意的?

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


逻辑偏移

逻辑偏移允许在映射到特定模式变量。 这可以用两个相应的函数表示:



Offset 函数描述
LAST(variable.field, n)返回映射到变量的第n个最后一个元素的事件的字段值。 计数从映射的最后一个元素开始。【意思也就是返回上N的值,详细参考下面例子】
FIRST(variable.field, n)从映射到变量的第n个元素的事件返回字段的值。 计数从映射的第一个元素开始。

例子
有关更全面的示例,可以查看以下模式和相应的条件:
PATTERN (A B+)
DEFINE
A AS A.price > 10,
B AS (LAST(B.price, 1) IS NULL OR B.price > LAST(B.price, 1)) AND
       (LAST(B.price, 2) IS NULL OR B.price > 2 * LAST(B.price, 2))
下表描述了如何为每个传入事件评估这些条件。
该表包含以下列:
price- 传入行的价格。
分类器 - 当前行的分类器,指示行映射到的模式变量。
LAST(B.price,1)/ LAST(B.price,2) - 描述评估这些表达式后的结果。


priceClassifierLAST(B.price, 1)LAST(B.price, 2)Comment
10-> A
15-> Bnullnull注意: LAST(A.price, 1) 是null因为换有值映射到 B.
20-> B15null
31-> B2015
353120没有映射因为35 < 2 * 20.

将默认模式变量与逻辑偏移一起使用也可能有意义。

在这种情况下,偏移量会考虑到目前为止映射的所有行:
PATTERN (A B? C)
DEFINE
B AS B.price < 20,
C AS LAST(price, 1) < C.price


priceClassifierLAST(price, 1)Comment
10-> A
15-> B
20-> C15LAST(price,1)被评估为映射到B变量的行的价格。

如果第二行没有映射到B变量,我们将得到以下结果:

priceClassifierLAST(price, 1)Comment
10-> A
20-> C10LAST(price,1)被评估为映射到A变量的行的价格。

也可以在多个模式变量中引用 FIRST/LAST函数的第一个参数。这样可以写一个访问多个列的表达式。但是这些都必须使用相同的模式变量。换句话说, LAST/FIRST函数的值必须是在单行中计算。

因此,可以使用LAST(A.price * A.tax),但不允许使用类似LAST(A.price * B.tax)的表达式。
最新经典文章,欢迎关注公众号
http://www.aboutyun.com/data/attachment/forum/201406/15/084659qcxzzg8n59b6zejp.jpg

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

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