1

BigQuery を使用して、ユーザー セッションを表す何億ものログ エントリを保存および分析することを検討しています。ソース生ログ エントリには、「接続」ログ タイプと「切断」ログ タイプが含まれます。

ログを bigquery に取り込む前にログを処理して、セッション開始 TIMESTAMP と「期間」値を含むセッションごとに 1 つのエントリを作成するか、各ログ エントリを個別に挿入して分析段階でセッション時間を計算するオプションがあります。 . テーブル スキーマが次の形式であるとします。

sessionStartTime: TIMESTAMP,
clientId: STRING,
duration: INTEGER

または (セッションごとに 2 つのログ エントリを保存する場合: 1 つの接続と 1 つの切断):

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

私たちの問題は、bigquery を使用して同時ユーザーを取得する方法が見つからないことです。理想的には、セッション テーブルをタイムスタンプの「バケット」(たとえば、毎分) で分割するクエリを記述し、クエリを実行して、特定の時間範囲の分。

ログエントリに関して同時実行数を考える簡単な方法は、関数 f(t) = x0 + connect(t) - disconnects(t) を使用していつでも計算されることです。ここで、x0 は初期同時ユーザー数です。 (時刻 t0)、t は「タイムスタンプ」バケット (この例では分単位) です。

誰でもこれを行う方法を推奨できますか?

ありがとう!

4

2 に答える 2

0

sessionStartTime の代わりに sessionEndTime を取得できますか (または単に期間 + セッション開始時間を追加します)? それができれば、このようなものが作れます。完全ではありませんが、ある程度関連するデータが得られます。

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
);
于 2013-10-28T12:19:27.067 に答える
0

サンプルデータありがとうございます!( https://bigquery.cloud.google.com/table/imgdge:sopub.sessionsで入手可能)

ログを bigquery に取り込む前にログを処理するオプションがあるので、セッション開始 TIMESTAMP と「期間」値を含む、セッションごとに 1 つのエントリを取得できます」今回は、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

この興味深い時間のリストを、新しいテーブルのすべてのセッションと組み合わせてみましょう。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'.

そして、それが同時ユーザーをカウントする方法です。

于 2013-11-04T00:40:46.803 に答える