时间窗口函数

最近更新时间:2019-05-20 17:25:19

窗口函数是一种特殊的函数,它并不在 SELECT 的投影列表中使用,而是在 GROUP BY 子句中使用。流计算 Oceanus 支持三种类型的窗口函数:TUMBLE、HOP、SESSION。

TUMBLE WINDOW

TUMBLE 窗口是一个个相连但不重叠的固定周期的窗口。

语法

TUMBLE(time_attr, interval)
 
其中 interval 的用法参见 时间相关函数
第一个参数表示时间戳字段,若没有定义 WATERMARK 则可以使用系统自动生成的 PROCTIME 时间戳字段,表示每条记录被处理时的时间戳。

注意:
如果在Event Time 时间模式下(使用 WATERMARK FOR BOUNDED 定义了时间戳字段),那么 TUMBLE 窗口函数的第一个参数必须为该字段;如果在 Processing Time 时间模式下,则 TUMBLE 窗口函数的第一个参数必须为 PROCTIME(大写)。HOP 和 SESSION 同理。

示例

TUMBLE(rowtime, INTERVAL '1' DAY)
其中 rowtime是数据源中的时间戳字段。

TUMBLE(PROCTIME, INTERVAL '2' HOUR)
其中 PROCTIME 是自动生成的记录被处理时的时间戳。

TUMBLE 窗口的示意图:

HOP WINDOW

HOP WINDOW 是一种滑动窗口,它保持窗口大小不变,每次滑动指定的时间周期,因而允许窗口之间的相互重叠。

语法

HOP(time_attr, sliding_interval, window_size_interval)

示例

HOP(rowtime, INTERVAL '1' HOUR, INTERVAL '1' DAY)
表示一个窗口大小为 1 天,滑动周期为 1 小时的 HOP 窗口。

HOP 窗口的示意图:

SESSION WINDOW

Session Window并非以长度来划分窗口,而是以非活跃时间来划分。例如超过 30 分钟不活跃(没有新数据),则之前的窗口结束,下一个来到的数据将会形成一个新窗口。

语法

SESSION(time_attr, interval)

示例

SESSION(rowtime, INTERVAL '12' HOUR)

SESSION 窗口的示意图:

另外,这三种窗口都有对应的辅助函数。以 TUMBLE 窗口为例(HOP、SESSION 也一样,只是前缀不同),有如下辅助函数:

  • TUMBLE_START:表示 TUMBLE 窗口的起始值(包含)。
    示例:

    SELECT user,
    TUMBLE_START(rowtime, INTERVAL '1' DAY) as wStart, 
    SUM(amount) FROM Orders 
    GROUP BY TUMBLE(rowtime, INTERVAL '1' DAY), user
  • TUMBLE_END:表示 TUMBLE 窗口的末端界限(不包含,只能用于 SELECT 后的列,不能用作JOIN或 GROUP 以及 OVER 条件。若需要请根据当前的时间模式(Event Time 或 Processing Time)分别使用下面的 TUMBLE_ROWTIME 或 TUMBLE_PROCTIME)
    TUMBLE_ROWTIME:表示 TUMBLE 窗口的末端界限(包含,可用作JOIN或 GROUP 以及 OVER 条件,Event Time 时间模式下使用)。
    示例:

    SELECT user,
    TUMBLE_START(rowtime, INTERVAL '12' HOUR) AS sStart,
    TUMBLE_ROWTIME(rowtime, INTERVAL '12' HOUR) AS snd,
    SUM(amount)
    FROM Orders
    GROUP BY TUMBLE(rowtime, INTERVAL '12' HOUR), user
  • TUMBLE_PROCTIME:表示 TUMBLE 窗口的末端界限(包含,可用作JOIN或 GROUP 以及 OVER 条件,Processing Time 时间模式下使用)。
    示例:

    SELECT user,
    TUMBLE_START(PROCTIME, INTERVAL '12' HOUR) AS sStart,
    TUMBLE_PROCTIME(PROCTIME, INTERVAL '12' HOUR) AS snd,
    SUM(amount)
    FROM Orders
    GROUP BY TUMBLE(PROCTIME, INTERVAL '12' HOUR), user