分享

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

pig2 2019-1-31 19:34:48 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 3953
本帖最后由 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个元素的事件返回字段的值。 计数从映射的第一个元素开始。

例子
有关更全面的示例,可以查看以下模式和相应的条件:
[mw_shl_code=sql,true]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))[/mw_shl_code]
下表描述了如何为每个传入事件评估这些条件。
该表包含以下列:
price  - 传入行的价格。
分类器 - 当前行的分类器,指示行映射到的模式变量。
LAST(B.price,1)/ LAST(B.price,2) - 描述评估这些表达式后的结果。

price
Classifier
LAST(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.

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

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

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

如果第二行没有映射到B变量,我们将得到以下结果:
price
Classifier
LAST(price, 1)
Comment
10-> A
20-> C10LAST(price,1)被评估为映射到A变量的行的价格。

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

因此,可以使用LAST(A.price * A.tax),但不允许使用类似LAST(A.price * B.tax)的表达式。
最新经典文章,欢迎关注公众号



已有(1)人评论

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

本版积分规则

关闭

推荐上一条 /2 下一条