基于事件的窗口的会话化

会话化是基于事件的窗口的特殊用例,它通常用于分析点击流,例如根据记录的 Web 点击识别 Web 浏览会话。

在 Vertica 中,假设有一个输入点击流表,其中每行记录了特定用户(或 IP 地址)的一次网页点击,会话化计算将根据两次点击之间的时间间隔对每个用户执行的点击操作进行分组,来尝试从已记录的点击中识别 Web 浏览会话。如果同一个用户的两次点击间隔的时间很长,超出了超时阈值,则会将这两个点击视为来自不同的浏览会话。

示例架构 此主题中的示例使用以下 WebClicks 架构表示一个简单的点击流表:

CREATE TABLE WebClicks(userId INT, timestamp TIMESTAMP);
INSERT INTO WebClicks VALUES (1, '2009-12-08 3:00:00 pm');
INSERT INTO WebClicks VALUES (1, '2009-12-08 3:00:25 pm');
INSERT INTO WebClicks VALUES (1, '2009-12-08 3:00:45 pm');
INSERT INTO WebClicks VALUES (1, '2009-12-08 3:01:45 pm');
INSERT INTO WebClicks VALUES (2, '2009-12-08 3:02:45 pm');
INSERT INTO WebClicks VALUES (2, '2009-12-08 3:02:55 pm');
INSERT INTO WebClicks VALUES (2, '2009-12-08 3:03:55 pm');
COMMIT;

WebClicks 输入表包含以下行:

=> SELECT * FROM WebClicks;
 userId |      timestamp
--------+---------------------
      1 | 2009-12-08 15:00:00
      1 | 2009-12-08 15:00:25
      1 | 2009-12-08 15:00:45
      1 | 2009-12-08 15:01:45
      2 | 2009-12-08 15:02:45
      2 | 2009-12-08 15:02:55
      2 | 2009-12-08 15:03:55
(7 rows)

在下列查询中,会话化在 SELECT 列表列中执行计算,显示使用 LAG() 的当前时间戳值和以前时间戳值之间的差值。当差值大于 30 秒时,它评估为 true,并递增窗口 ID。

=> SELECT userId, timestamp,
     CONDITIONAL_TRUE_EVENT(timestamp - LAG(timestamp) > '30 seconds')
     OVER(PARTITION BY userId ORDER BY timestamp) AS session FROM WebClicks;
 userId |      timestamp      | session
--------+---------------------+---------
      1 | 2009-12-08 15:00:00 |       0
      1 | 2009-12-08 15:00:25 |       0
      1 | 2009-12-08 15:00:45 |       0
      1 | 2009-12-08 15:01:45 |       1
      2 | 2009-12-08 15:02:45 |       0
      2 | 2009-12-08 15:02:55 |       0
      2 | 2009-12-08 15:03:55 |       1
(7 rows)

在输出中,会话列包含来自 CONDITIONAL_TRUE_EVENT 函数的窗口 ID。窗口 ID 在第 4 行(时间戳 15:01:45)中评估为 true,且第 4 行后面的 ID 是零,因为它是新分区的起点(对于用户 ID 2),即第 4 行后面的行没有评估为 ture,直到输出的最后一行。

您可能要为用户设置不同的超时阈值。例如,一个用户的网络连接较慢或者它可能是多任务用户,而另一用户的网络连接较快,主要访问一个网站,执行一项任务。

要基于最后 2 次点击计算自适应的超时阈值,请结合 LAG 使用 CONDITIONAL_TRUE_EVENT 以返回最后 2 次点击之间的平均时间(宽限期为 3 秒):

=> SELECT userId, timestamp, CONDITIONAL_TRUE_EVENT(timestamp - LAG(timestamp) >
(LAG(timestamp, 1) - LAG(timestamp, 3)) / 2 + '3 seconds')
OVER(PARTITION BY userId ORDER BY timestamp) AS session
FROM WebClicks;
 userId |      timestamp      | session
--------+---------------------+---------
      2 | 2009-12-08 15:02:45 |       0
      2 | 2009-12-08 15:02:55 |       0
      2 | 2009-12-08 15:03:55 |       0
      1 | 2009-12-08 15:00:00 |       0
      1 | 2009-12-08 15:00:25 |       0
      1 | 2009-12-08 15:00:45 |       0
      1 | 2009-12-08 15:01:45 |       1
(7 rows)

另请参阅