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真题
