本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
单调表达式和运算符
由于 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 行会很有用。但是,当前版本不支持声明的排序键。
单调表达式
如果亚马逊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)是单调表达式。