BigQuery에서 Google 애널리틱스 세션을 계산해 보세요. #1

무엇을 할까?



Google 애널리틱스 세션 정의 (htps : // 꼬리 rt. 오, ぇ. 코 m / 아나 ly 치 cs / 안수 r / 2731565? hl = 그럼),
  • (정의 1) 사용자가 아무 작업도 수행하지 않고 30 분이 경과 할 때까지 지속
  • (정의 2) 사용자 조작이 완료되면 만료 시간은 30 분 후에 재설정됩니다.
  • (정의 3) 하루의 끝으로 인한 만료

  • 의 느낌의 session 의 카운트를 BigQuery 로 해 보자고 하는 기획.

    이번 #1 에서는 정의 1,2 를 실시합니다.

    준비



    schema.json


    [
      {"name": "datetime", "type": "TIMESTAMP", "mode": "required"},
      {"name": "user_id", "type": "string", "mode": "required"}
    ]
    

    data.json


    {"datetime":"2019-11-30T00:00:00","user_id":"a"}
    {"datetime":"2019-11-30T00:29:59","user_id":"a"}
    {"datetime":"2019-11-30T01:00:00","user_id":"a"}
    {"datetime":"2019-11-30T01:30:00","user_id":"a"}
    {"datetime":"2019-11-30T00:00:00","user_id":"b"}
    {"datetime":"2019-11-30T00:00:10","user_id":"b"}
    {"datetime":"2019-11-30T00:30:09","user_id":"b"}
    

    테이블 생성 및 데이터 로드


    bq load --source_format=NEWLINE_DELIMITED_JSON YOURPROJECT:YOURDATASET.access_log ./data.json ./schema.json
    

    SQL을 작성해 봅니다.



    같은 유저의 한전의 access 가 1800 초 이상전이면, 새로운 세션이라고 하는 플래그를 세운다.
    라는 Query를 작성해 보겠습니다. 다음과 같습니다.
      -- #3
    SELECT
      user_id,
      ((datetime - prev_seconds) / (1000*1000) )as duration_sec,
      IFNULL(datetime - prev_seconds >= 30 * 60 * 1000 * 1000, TRUE) AS start_of_session,
      datetime,
      prev_seconds
    FROM (
        -- #2
      SELECT
        user_id,
        datetime,
        LAG(datetime, 1) OVER(PARTITION BY user_id ORDER BY datetime) AS prev_seconds
      FROM (
          -- #1
        SELECT
          *
        FROM
          [YOURPROJECT:YOURDATASET.access_log] ) AS activity_log)
    

    그리고이 Query의 결과는



    이런 느낌이 들고 무사히 start_of_session = true 라는 플래그가 붙었습니다.

    다음 번



    다음 번에는 정의 3을 수행합니다.

    좋은 웹페이지 즐겨찾기