文中举例均为简单示例,根据业务自行扩展。
实际业务场景中很多会需要统计 pv uv 值,比如页面的 pv uv 值,商品、店铺的 pv uv 值……
这边举一个简单的例子,比如说统计商品访问的 pv uv:
- 简单的源数据表创建如下:
1 | CREATE TABLE IF NOT EXISTS test.product_operation |
像这种数据量可能很大,又需要预先聚合计算以减小获取耗时的,我们添加 物化视图 来帮助我们做这个事。
- 创建按天聚合数据的物化视图:
1 | CREATE MATERIALIZED VIEW IF NOT EXISTS test.product_operation_day_pv_uv_mv |
- 创建总的聚合数据的物化视图:
1 | CREATE MATERIALIZED VIEW IF NOT EXISTS test.product_operation_total_pv_uv_mv |
- 现在我们往源数据表中插入一条数据:
1 | INSERT INTO test.product_operation(ts_date_time, gen_date_time, product_id, user_id, operation) |
- 再查询:
忽略时区问题导致的时间显示
1 | SELECT * FROM test.product_operation ORDER BY gen_date_time DESC; |
| ts_date_time | gen_date_time | product_id | user_id | operation |
|---|---|---|---|---|
| 2022-01-26 02:10:10 | 2022-01-26 03:54:36 | 1 | 1 | 1 |
- 查询视图(day):
1 | SELECT ts_date, product_id, operation, sumMerge(pv) AS pv, uniqMerge(uv) AS uv |
| ts_date | product_id | operation | pv | uv |
|---|---|---|---|---|
| 2022-01-26 | 1 | 1 | 1 | 1 |
- 查询视图(total):
1 | SELECT product_id, operation, sumMerge(pv) AS pv, uniqMerge(uv) AS uv |
| product_id | operation | pv | uv |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
- 再往源数据插入数据:
1 | INSERT INTO test.product_operation(ts_date_time, gen_date_time, product_id, user_id, operation) |
- 查询视图:
| ts_date | product_id | operation | pv | uv |
|---|---|---|---|---|
| 2022-01-26 | 1 | 1 | 2 | 1 |
| product_id | operation | pv | uv |
|---|---|---|---|
| 1 | 1 | 2 | 1 |
- 换个
user_id插入数据:
1 | INSERT INTO test.product_operation(ts_date_time, gen_date_time, product_id, user_id, operation) |
- 查询视图:
| ts_date | product_id | operation | pv | uv |
|---|---|---|---|---|
| 2022-01-25 | 1 | 1 | 3 | 2 |
| product_id | operation | pv | uv |
|---|---|---|---|
| 1 | 1 | 3 | 2 |
- 再换个
ts_date_time插入数据:
1 | INSERT INTO test.product_operation(ts_date_time, gen_date_time, product_id, user_id, operation) |
- 查询视图:
| ts_date | product_id | operation | pv | uv |
|---|---|---|---|---|
| 2022-01-26 | 1 | 1 | 3 | 2 |
| 2022-01-27 | 1 | 1 | 2 | 2 |
| product_id | operation | pv | uv |
|---|---|---|---|
| 1 | 1 | 5 | 2 |
综上,实现不难,clickhouse 丰富的聚合函数可以节省很多操作。
还可以用 Kafka引擎 做数据的增量同步,结合视图。