1. 函数解释
windowFunnel(window, [mode, [mode, ... ]])(timestamp, cond1, cond2, ..., condN)
参数:
window:滑动窗户的大小,表示事件链中第一个事件和最后一个事件的最大间隔。 单位取决于timestamp。用表达式来表示则是:timestamp of cond1 <= timestamp of cond2 <= … <= timestamp of condN <= timestamp of cond1 + window。
mode:这是一个可选的参数,可以设置一个或多个参数。
- ‘strict_deduplication’ - 如果事件链中出现相同的条件,则会停止进一步搜索。
- ‘strict_order’ - 不允许其他事件的介入。 例如:在A->B->D->C的情况下,它在D停止继续搜索A->B->C,最大事件数为2。
- ‘strict_increase’ - 事件链中的时间戳必须严格上升。
timestamp:包含时间戳的列。 数据类型支持:Date, Datetime 和 其他无符号整数类型(请注意,即使时间戳支持 UInt64 类型,它的值也不能超过Int64最大值,即2^63-1)。
cond:事件链的约束条件,UInt8 类型。
返回值: 窗口期内连续触发条件链的最大数目。 # 2. 实例分析 建事件表:sql
CREATE TABLE event1 (
uid String COMMENT '用户id',
eventId String COMMENT '事件id',
eventTime UInt64 COMMENT '事件发生时间(秒)'
) ENGINE = MergeTree PARTITION BY (uid, eventTime)
ORDER BY (uid, eventTime) SETTINGS index_granularity = 8192
插入如下数据作为测试数据:
sql
INSERT INTO event1 (uid, eventId, eventTime)
VALUES
('uid1','event1',1551398404),
('uid1','event2',1551398406),
('uid1','event3',1551398408),
('uid2','event2',1551398412),
('uid2','event3',1551398415),
('uid3','event3',1551398410),
('uid3','event4',1551398413)
## 2.1 查询1
当我们设置的窗口期为4秒,条件链为 event2 -> event3 时:
SELECT
uid,
windowFunnel(4)(toDateTime(eventTime),eventid = 'event2',eventid = 'event3') as funnel
FROM event1
GROUP BY uid;
查询得到的结果为:
uid funnel
uid1 2
uid2 2
uid3 0
他是怎么得到这个结果的?
首先将所有的数据根据uid聚合和排序(排序是windowFunnel里自己实现的),得到:
- uid1: (event1,1551398404) -> (event2,1551398406) -> (event3,1551398408)
- uid2: (event2,1551398412) -> (event3,1551398415)
- uid3: (event3 ,1551398410) -> (event4,1551398413)
由上述聚合和排序之后的条件链中,只有 uid1 和 uid2 有 event2 -> event3 的条件链,且时间差分别为:
- uid1:2(1551398408 - 1551398406)
- uid2:3(1551398415 - 1551398412)
小于窗口期 4 秒,所以满足条件,故 uid1 和 uid2 的结果都为2(event2, event3), 而 uid3 为 0(没有满足条件的条件链)
2.2 查询2
当我们设置的窗口期为 2 秒,条件链为 event2 -> event3 时:
SELECT
uid,
windowFunnel(2)(toDateTime(eventTime),eventid = 'event2',eventid = 'event3') AS funnel
FROM event1
GROUP BY uid;
查询得到的结果为:
uid funnel
uid1 2
uid2 1
uid3 0
为什么 uid2 变成了 1 ?
因为 uid2 的条件链中的 event3 和 event2 的时间差是 3,大于了滑动窗口时间 2,所以只有第一个条件 event2 满足查询,故结果为 1 。
2.3 查询3
当我们设置的窗口期为 4 秒,条件链为 event3 -> event4 时:
SELECT
uid,
windowFunnel(4)(toDateTime(eventTime),eventid = 'event3',eventid = 'event4') AS funnel
FROM event1
GROUP BY uid;
查询得到的结果为:
uid funnel
uid1 1
uid2 1
uid3 2
因为 uid1 和 uid2 只有事件 event3,没有事件 event4 。
而 uid3 既有 event3 ,也有 event4 ,且两个事件的时间差小于窗口期 4秒,故 uid3 的结果为 2 。