本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
单调表达式和运算符
由于Amazon Kinesis Data Analytics查询对无限的行流进行操作,因此某些操作只有在对这些流有所了解的情况下才有可能。
例如,给定一个订单流,要求一个按天和产品汇总订单的流是有意义的(因为日子在增加),但不要求一个按产品和发货状态汇总订单的流。我们永远无法完成 Widget X 到俄勒冈的摘要,因为我们永远看不到 Widget 到俄勒冈的 “最后一次” 订单。
按特定列或表达式排序的流的此属性称为单调性。
一些与时间相关的定义:
单调。如果表达式是升序或降序,则该表达式是单调的。等效的措辞是 “不递减或不增加”。
升序。如果给定行的 e 值始终大于或等于前一行的值,则表达式 e 在流中呈上升趋势。
降序。如果给定行的 e 值始终小于或等于前一行的值,则表达式 e 在流中降序。
严格升序。如果给定行的 e 值始终大于前一行的值,则表达式 e 在流中严格升序。
严格降序。如果给定行的 e 值始终小于前一行的值,则表达式 e 在流中严格按降序排列。
常量。如果给定行的 e 值始终等于前一行的值,则表达式 e 在流中为常量。
请注意,根据这个定义,常量表达式被认为是单调的。
单调列
ROWTIME 系统列按升序排列。ROWTIME 列并非严格按升序排列:连续行具有相同的时间戳是可以接受的。
Amazon Kinesis Data Analytics 会阻止客户端在流中插入其时间戳早于该客户端在流中写入的上一行的时间戳的行。Amazon Kinesis Data Analytics 还确保在多个客户端将行插入到同一个流中时,这些行会进行合并,以便 ROWTIME 列是升序的。
显然,断言 orderId 列是升序的;或者断言任何 orderId 与排序顺序的距离都不会超过 100 行会很有用。但是,当前版本不支持声明的排序键。
单调表达式
Amazon Kinesis Data Analytics如果表达式知道其参数是单调的,则可以推断出该表达式是单调的。(另请参阅单调函数。)
另一个定义:
单调的函数或运算符
如果将函数或运算符应用于严格递增的值序列时,它会产生单调的结果序列,则该函数或运算符是单调的。
例如,FLOOR 函数应用于升序输入 {1.5, 3, 5, 5.8, 6.3} 时,生成 {1, 3, 5, 5, 5, 6}。请注意,输入严格按升序排列,但输出仅为升序(包括重复值)。
推断单调性的规则
Amazon Kinesis Data Analytics要求一个或多个分组表达式有效,流式传输 GROUP BY 语句才有效。在其他情况下,Amazon Kinesis Data Analytics如果它知道单调性,则可以提高操作效率;例如,如果它知道某个特定键将永远不会在直播中出现,则可以从窗口聚合总数表中删除条目。
为了以这种方式利用单调性,Amazon Kinesis Data Analytics使用一组规则来推断表达式的单调性。以下是推断单调性的规则:
| 表达式 | 单调性 |
|---|---|
|
c |
常量 |
|
FLOOR(m) |
与 m 相同,但不严格 |
|
天花板/天花板(m) |
与 m 相同,但不严格 |
|
天花板/天花板(m 到 TimeUnit) |
与 m 相同,但不严格 |
|
FLOOR(m 到 TimeUnit) |
与 m 相同,但不严格 |
|
SUBSTRING(m 从 0 变为 c) |
与 m 相同,但不严格 |
|
+ m |
和 m 一样 |
|
-m |
反向m |
|
m + c c + m |
和 m 一样 |
|
m1 + m2 |
如果 m1 和 m2 的方向相同,则与 m1 相同; 否则不是单调的 |
|
c-m |
反向m |
|
m * c c* m |
如果 c 为正,则与 m 相同; m 的反向是 c 为负;常量 (0) c 为 0 |
|
c/ m |
如果 m 始终为正数或始终为负数,并且 c 和 m 的符号相同,则与 m 相同; 如果 m 始终为正数或始终为负数,并且 c 和 m 的符号不同,则 m 反转; 否则不是单调的 |
|
常量 |
|
|
升序 |
在整个表中,c 是一个常数,而 m(也是 m1 和 m2)是单调表达式。