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

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

单调表达式和运算符

由于 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、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

当前_ROW_TIMESTAMP

CURRENT_DATE

升序

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