感谢您提供样本数据!(可在https://bigquery.cloud.google.com/table/imgdge:sopub.sessions获得)
我会接受您的提议:“我们可以选择在将日志提取到 bigquery 之前对其进行处理,以便每个会话都有一个条目,其中包含会话开始 TIMESTAMP 和“持续时间”值”。这一次,我将使用 BigQuery 进行处理,并将结果保留在我自己的表中:
SELECT u, start, MIN(end) end FROM (
SELECT a.f0_ u, a.time start, b.time end
FROM [imgdge:sopub.sessions] a
JOIN EACH [imgdge:sopub.sessions] b
ON a.f0_ = b.f0_
WHERE a.type = 'connect'
AND b.type='disconnect'
AND a.time < b.time
)
GROUP BY 1, 2
这给了我 819,321 行。对于 BigQuery 来说不是一个很大的数字,但由于我们要组合它,它可能会爆炸。我们将限制计算并发会话的日期范围以保持正常。我将此查询的结果保存到 [fh-bigquery:public_dump.imgdge_sopub_sessions_startend]。
一旦我有了开始和结束时间的所有会话,我就可以找到每个有趣的瞬间有多少并发会话。你说的分分钟?
所有有趣的分钟恰好是:
SELECT SEC_TO_TIMESTAMP(FLOOR(TIMESTAMP_TO_SEC(time)/60)*60) time
FROM [imgdge:sopub.sessions]
GROUP BY 1
现在让我们将这个有趣的时间列表与我的新表中的所有会话结合起来。对于每一分钟,我们将计算在此之前开始并在此之后结束的所有会话:
SELECT time, COUNT(*) concurrent
FROM (
SELECT u, start, end, 99 x
FROM [fh-bigquery:public_dump.imgdge_sopub_sessions_startend]
WHERE start < '2013-09-30 00:00:00'
) a
JOIN
(
SELECT SEC_TO_TIMESTAMP(FLOOR(TIMESTAMP_TO_SEC(time)/60)*60) time, 99 x FROM [imgdge:sopub.sessions] GROUP BY 1) b
ON a.x = b.x
WHERE b.time < a.end
AND b.time >= a.start
GROUP BY 1
注意99 x. 它可以是任何数字,我只是一直使用它来生成所有会话 * 的组合。这种组合游戏的会话太多,所以我用WHERE start < '2013-09-30 00:00:00'.
这就是您可以计算并发用户的方式。