跳到主要内容

session_window:会话窗口生成

速查结论

session_window(time_column, gap_duration) 是 Spark SQL 中用于根据时间戳列和间隔持续时间生成会话窗口的函数。

语法

session_window(time_column, gap_duration)

参数说明

参数说明
time_column用作按时间窗口化的时间戳的列或表达式。时间列必须是TimestampType类型
gap_duration一个字符串,指定会话的超时时间,表示为"间隔值"(有关更多详细信息,请参见间隔文字。)对于固定间隔持续时间,或是一个应用于每个输入并计算为动态间隔持续时间的"间隔值"的表达式

session_window(time_column, gap_duration) - 根据指定的时间戳列和间隔持续时间生成会话窗口。有关详细解释和示例,请参见结构化流指南文档中的"时间窗口的类型"。

Examples:

> SELECT a, session_window.start, session_window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:10:00'), ('A2', '2021-01-01 00:01:00') AS tab(a, b) GROUP by a, session_window(b, '5 minutes') ORDER BY a, start;
A1 2021-01-01 00:00:00 2021-01-01 00:09:30 2
A1 2021-01-01 00:10:00 2021-01-01 00:15:00 1
A2 2021-01-01 00:01:00 2021-01-01 00:06:00 1
> SELECT a, session_window.start, session_window.end, count(*) as cnt FROM VALUES ('A1', '2021-01-01 00:00:00'), ('A1', '2021-01-01 00:04:30'), ('A1', '2021-01-01 00:10:00'), ('A2', '2021-01-01 00:01:00'), ('A2', '2021-01-01 00:04:30') AS tab(a, b) GROUP by a, session_window(b, CASE WHEN a = 'A1' THEN '5 minutes' WHEN a = 'A2' THEN '1 minute' ELSE '10 minutes' END) ORDER BY a, start;
A1 2021-01-01 00:00:00 2021-01-01 00:09:30 2
A1 2021-01-01 00:10:00 2021-01-01 00:15:00 1
A2 2021-01-01 00:01:00 2021-01-01 00:02:00 1
A2 2021-01-01 00:04:30 2021-01-01 00:05:30 1

常见报错与避坑指南

  • time_column 类型限制:time_column 必须是 TimestampType 类型,传入其他类型(如 String 或 Date)会报错或产生意外结果。请先用 to_timestamp() 转换。
  • 动态 gap_duration 的使用:当 gap_duration 使用 CASE WHEN 表达式动态计算时,确保所有分支返回合法的间隔值,否则运行时可能抛出异常。
  • 会话合并逻辑:相邻会话的间隔小于等于 gap_duration 时会被合并为一个会话窗口。设计 gap_duration 时需根据业务对"会话超时"的定义合理设置。

Since: 3.2.0

📱关注公众号

「数据仓库技术」文章同步更新,不错过每一篇干货

微信公众号二维码
💬加群交流

备注「数据仓库技术」加入社群,每日一道大厂SQL真题

交流微信二维码

你可能还想看