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

单调表达式和运算符

由于 Amazon Kinesis Data Analytics 查询针对无数个行流运行,因此,有些操作只有在了解这些流的某些信息的情况下时才能执行。

例如,假设有一个订单流,那么要求提供一个按日期和产品汇总订单的流是有意义的 (因为日期是每天变化的),但要求提供一个按产品和发货状态汇总订单的流是没有意义的。我们永远无法完成发运到俄勒冈州的小部件 X 的汇总 (举例来说),因为我们永远看不到发运到俄勒冈州的小部件的“最后一个”订单。

按特定列或表达式排序的流的这个属性称为单调性。

一些与时间相关的定义:

  • 单调。如果某个表达式是升序或降序的,则该表达式是单调的。一种等同的说法是“非下降或非上升”。

  • 升序。如果表达式 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

Constant

FLOOR(m)

与 m 相同,但不严格

CEIL / CEILING(m)

与 m 相同,但不严格

CEIL / CEILING(m TO timeUnit)

与 m 相同,但不严格

FLOOR(m TO timeUnit)

与 m 相同,但不严格

SUBSTRING(m FROM 0 FOR 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 相同;

如果 c 为负数,则为 m 的反转;如果 c 为 0,则为常量 (0)

c / m

如果 m 始终为正数或负数,并且 c 和 m 具有相同的符号,则与 m 相同;

如果 m 始终为正数或负数,并且 c 和 m 具有不同的符号,则为 m 的反转;

否则不是单调的

Constant

LOCALTIME

LOCALTIMESTAMP

CURRENT_ROW_TIMESTAMP

CURRENT_DATE

升序

在整个表中,c 为常量,m (即 m1 和 m2) 为单调表达数。