查找从日志条目创建的会话表中的并发用户

时间:2013-10-27 13:05:55

标签: google-bigquery

我们正在探索使用Bigquery来存储和分析代表用户会话的100万个日志条目。源原始日志条目包含" connect"日志类型和"断开"日志类型。

我们可以选择在将日志提取到bigquery之前对其进行处理,这样我们每个会话都有一个条目,包含会话开始TIMESTAMP和#34;持续时间"值,或单独插入每个日志条目并在分析阶段计算会话时间。让我们假设我们的表模式具有以下形式:

sessionStartTime: TIMESTAMP,
clientId: STRING,
duration: INTEGER

或(如果我们在每个会话中存储两个日志条目:一个连接和一个断开连接):

time: TIMESTAMP,
type: INTEGER, //enum, 0 for connect, 1 for disconnect
clientId: STRING

我们的问题是我们找不到使用bigquery获取并发用户的方法:理想情况下,我们可以编写一个查询来按时间戳分区会话表"桶" (让我们每分钟说一遍)并执行一个查询,它会在一定的时间范围内每分钟给出一次。

考虑关于日志条目的并发症的简单方法是,在任何时刻它们都是使用函数f(t)= x0 + connections(t) - disconnectcts(t)计算的,其中x0是初始值并发用户数(在时间t0),t是"时间戳"桶(在这个例子中以分钟为单位)。

有人可以推荐一种方法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

你能代替sessionStartTime获取sessionEndTime(或者只是添加持续时间+ sessionStartTime)吗?如果你能做到这一点就可以做到这一点。它并不完美,但会给你一些相关的数据。

SELECT AVG(perMinute) as avgUsersMin FROM
(
    SELECT COUNT(distinct clientId, 1000000) as perMinute, YEAR(sessionEndTime) as y,
    MONTH(sessionEndTime) as m, DAY(sessionEndTime) as d, HOUR(sessionEndTime) as h, MINUTE(sessionEndTime) as mn FROM [MyProject:MyTable]
    WHERE sessionEndTime BETWEEN someDate AND someOtherDate
    GROUP BY y,m,d,h,mn
);

答案 1 :(得分:0)

感谢您提供样本数据! (可在https://bigquery.cloud.google.com/table/imgdge:sopub.sessions

获取

我会接受你的提议“我们可以选择在将日志提取到bigquery之前处理日志,这样我们每个会话都有一个条目,包含会话开始TIMESTAMP和'duration'值”。这一次,我将使用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'来限制它们。

这就是你如何计算并发用户的数量。