本帖最后由 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 | -> B | null | null | 注意: LAST(A.price, 1) 是null因为换有值映射到 B. | 20 | -> B | 15 | null | | 31 | -> B | 20 | 15 | | 35 | | 31 | 20 | 没有映射因为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 | -> C | 15 | LAST(price,1)被评估为映射到B变量的行的价格。 |
如果第二行没有映射到B变量,我们将得到以下结果:
price | Classifier | LAST(price, 1) | Comment | 10 | -> A | | | 20 | -> C | 10 | LAST(price,1)被评估为映射到A变量的行的价格。 |
也可以在多个模式变量中引用 FIRST/LAST函数的第一个参数。这样可以写一个访问多个列的表达式。但是这些都必须使用相同的模式变量。换句话说, LAST/FIRST函数的值必须是在单行中计算。
因此,可以使用LAST(A.price * A.tax),但不允许使用类似LAST(A.price * B.tax)的表达式。
最新经典文章,欢迎关注公众号
|
|