Skip to main content

点击流分析

概览

无论一个网站每天的访问量是几百还是几百万,点击流数据都能通过分析网站的不同指标揭示出有价值的洞察。点击流数据不仅能显示网站上特定页面的受欢迎程度,还能有效替代传统的市场研究方法。我们可以根据用户行为来验证数字营销活动、用户体验设计等的有效性,而无需使用传统的调查方法。

点击流数据提供了用户如何浏览特定网站的详细日志。它显示了用户在特定页面上停留了多长时间、从何处跳转访问,以及接下来点击了什么。如果许多用户很快离开了一个页面,这表明需要改进以增加用户互动。

在本教程中,您将学习如何使用 RisingWave 跟踪网页随时间的点击次数。我们为本教程设置了一个演示集群,以便您可以轻松尝试。

开始之前

  • 确保您的环境中安装了 DockerDocker Compose。请注意,Docker Compose 包含在 Windows 和 macOS 的 Docker Desktop 中。如果您使用 Docker Desktop,请确保在启动演示集群之前已经运行。
  • 确保 PostgreSQL 交互式终端 psql 已安装在您的环境中。有关详细说明,请参阅 下载 PostgreSQL

第 1 步:启动演示集群

在演示集群中,我们打包了 RisingWave 和一个工作负载生成器。一旦集群启动,工作负载生成器将开始生成随机流量,并将它们发送到 Kafka。

首先,将 risingwave 仓库克隆到环境中。

git clone https://github.com/risingwavelabs/risingwave.git

导航到 integration_tests/clickstream 目录,并从 docker compose 文件启动演示集群。

cd risingwave/integration_tests/clickstream
docker compose up -d
命令未找到?

Compose V2 中的默认命令行句法以 docker compose 开头。详见 Docker 文档

如果您使用的是 Compose V1,请改用 docker-compose

必要的 RisingWave 组件将被启动,包括 Frontend 节点、Compute 节点、Meta 节点和 MinIO。工作负载生成器将开始生成随机数据并将它们发送到 Kafka topic。在这个演示集群中,物化视图的数据将存储在 MinIO 实例中。

连接到 RisingWave 以管理数据流并执行数据分析。

psql -h localhost -p 4566 -d dev -U root

第 2 步:将 RisingWave 连接到数据流

我们已经使用演示集群以 JSON 格式在 Kafka 中设置了数据流,我们可以使用以下 SQL 语句连接到这些流。数据包含了每个用户点击的信息以及每个事件的时间戳。

CREATE SOURCE user_behaviors (
user_id VARCHAR,
target_id VARCHAR,
target_type VARCHAR,
event_timestamp TIMESTAMP WITH TIME ZONE,
behavior_type VARCHAR,
parent_target_type VARCHAR,
parent_target_id VARCHAR
) WITH (
connector = 'kafka',
topic = 'user_behaviors',
properties.bootstrap.server = 'message_queue:29092',
scan.startup.mode = 'earliest'
) FORMAT PLAIN ENCODE JSON;

RisingWave 已连接到流,但尚未开始消费数据。要处理数据,我们需要定义物化视图。创建物化视图后,RisingWave 将从指定的偏移量开始消费数据。

第 3 步:创建物化视图

在本教程中,我们将创建一个物化视图,用于计算一天内点击某个帖子的次数。

首先,tumble() 函数将每个事件映射到一个 10 分钟的窗口,以创建一个中间表 t,在该表中,事件将根据 target_idwindow_time 聚合,以获取每个帖子的点击次数。事件还将根据 target_typebehavior_type 进行过滤。

接下来,hop() 函数将每 10 分钟创建一个 24 小时的时间窗口。每个事件将被映射到相应的窗口。最后,它们将根据 target_idwindow_time 分组,以计算每个帖子在 24 小时内的总点击次数。

有关 tumble 和 hop 函数及聚合的解释,请参阅 时间窗口函数

CREATE MATERIALIZED VIEW thread_view_count AS WITH t AS (
SELECT
target_id,
COUNT() AS view_count,
window_start AS window_time
FROM
TUMBLE(
user_behaviors,
event_timestamp,
INTERVAL '10 minutes'
)
WHERE
target_type = 'thread'
AND behavior_type = 'show'
GROUP BY
target_id,
window_start
)
SELECT
target_id,
SUM(t.view_count) AS view_count,
window_start,
window_end
FROM
HOP(
t,
t.window_time,
INTERVAL '10 minutes',
INTERVAL '1440 minutes'
)
GROUP BY
target_id,
window_start,
window_end;

第 4 步:查询结果

我们可以使用以下语句查询最常被查看的帖子。

SELECT * FROM thread_view_count
ORDER BY view_count DESC, window_start
LIMIT 5;

结果如下所示:

 target_id | view_count |       window_start        |        window_end
-----------+------------+---------------------------+---------------------------
thread58 | 15 | 2022-09-22 06:50:00+00:00 | 2022-09-23 06:50:00+00:00
thread58 | 15 | 2022-09-22 07:00:00+00:00 | 2022-09-23 07:00:00+00:00
thread58 | 15 | 2022-09-22 07:10:00+00:00 | 2022-09-23 07:10:00+00:00
thread58 | 15 | 2022-09-22 07:20:00+00:00 | 2022-09-23 07:20:00+00:00
thread58 | 15 | 2022-09-22 07:30:00+00:00 | 2022-09-23 07:30:00+00:00
(5 rows)

我们还可以通过指定时间间隔来查询结果。有关日期和时间函数及操作符的更多信息,请参阅 日期和时间

SELECT * FROM thread_view_count
WHERE window_start > ('2022-09-23 06:50Z' :: TIMESTAMP WITH TIME ZONE - INTERVAL '1 day')
AND window_start <
('2022-09-23 07:40Z' :: TIMESTAMP WITH TIME ZONE - INTERVAL '1 day' + INTERVAL '10 minutes')
AND target_id = 'thread58'
ORDER BY window_start;

结果如下所示:

 target_id | view_count |       window_start        |        window_end
-----------+------------+---------------------------+---------------------------
thread58 | 15 | 2022-09-22 06:50:00+00:00 | 2022-09-23 06:50:00+00:00
thread58 | 15 | 2022-09-22 07:00:00+00:00 | 2022-09-23 07:00:00+00:00
thread58 | 15 | 2022-09-22 07:10:00+00:00 | 2022-09-23 07:10:00+00:00
thread58 | 15 | 2022-09-22 07:20:00+00:00 | 2022-09-23 07:20:00+00:00
thread58 | 15 | 2022-09-22 07:30:00+00:00 | 2022-09-23 07:30:00+00:00
thread58 | 15 | 2022-09-22 07:40:00+00:00 | 2022-09-23 07:40:00+00:00
(6 rows)

完成后,运行以下命令断开 RisingWave 的连接。

\q

可选:要删除容器和生成的数据,请使用以下命令。

docker compose down -v

总结

在本教程中,我们学到了:

  • 如何使用 tumble 和 hop 时间窗口函数获得时间窗口化的聚合结果。
  • 如何比较时间间隔。