单调表达式和运算符 - Amazon Kinesis Data Analytics
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

单调表达式和运算符

由于 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 反转;

否则不是单调的

常量

LOCALTIME

LOCALTIMESTAMP

当前行时间戳

CURRENT_DATE

升序

在整个表中,c 是一个常数,而 m(也是 m1 和 m2)是单调表达式。