액세스 로그에서 세션을 만드는 방법

배경



로그 분석의 분야에서 세션 집계라는 것은 주류이지만, 그것을 실현하기 위해서는 특정의 업자의 툴이나 룰에 의해 집계되고 있는 경우가 많다.
좀처럼 스스로 규칙을 정해 집계하는 것 이전에는 어려웠습니다만, 쿼리로 간단하게 집계할 수 있다고 하는 순서를 설명하겠습니다.

준비



이번에도 트레저 데이터의 기능을 이용해 시험해 보겠습니다.
지난번 마찬가지로 JavaScriptSDK로 디폴트로 취득할 수 있는 로그를 이용합니다.
  • 주로 집계에 이용하는 유저 함수(UDF):TD_SESSIONIZE
    사용법은 매뉴얼 를 참고로 했습니다.
  • 하고 싶은 일
     - 세션 집계를 해본다
    - 각 세션에 대한 사용자 세그먼트 등을 작성해보십시오

  • 그럼 실제로 실행해 봅시다.

    집계 방법



    집계한 테이블은 보류 데이터의 ResultOutput 기능을 이용하여
    데이터를 내보냅니다.
  • 준비한 로그에 세션 ID 부여
    작성한 집계 테이블 : session
  • --hive
    SELECT 
      TD_SESSIONIZE(time, 86400, td_ip) as session_id
    , time
    , td_ip
    , td_path
    , td_client_id
    , td_title
    , td_browser
    , td_color
    , td_os_version
    , td_browser_version
    , td_referrer 
    , td_screen 
    , td_os
    , td_host 
    , td_url
    , td_language
    FROM 
    (
      SELECT time, td_ip, td_path, td_client_id, td_title
            ,td_browser, td_color, td_os_version
            ,td_browser_version, td_referrer, td_screen 
            ,td_os, td_host, td_url, td_language
      from access
      distribute by td_ip
      sort by td_ip,time
    ) a 
    

    * 세션 ID별로 시작 시간과 종료 시간을 집계합니다.
     (그 세션이 몇 PV일까 함께 출력)
    집계된 테이블 이름: session_summary
    SELECT
       b.session_id as session_id
     , b.td_client_id as td_client_id
     , TD_TIME_FORMAT(b.session_start_time, 'yyyy-MM-dd HH:mm:ss', 'JST') as session_start_time
     , TD_TIME_FORMAT(b.session_end_time, 'yyyy-MM-dd HH:mm:ss', 'JST') as session_end_time
     , (b.session_end_time - b.session_start_time) as session_stay_time
     , b.session_cnt as session_cnt
    FROM
    (
    SELECT
       a.session_id as session_id
     , a.td_client_id as td_client_id
     , min(a.time) as session_start_time
     , max(a.time) as session_end_time
     , count(1) as session_cnt
    FROM
    (
      SELECT 
        TD_SESSIONIZE(time, 86400, td_ip) as session_id
      , time
      , td_ip
      , td_path
      , td_client_id
      FROM (
        SELECT time, td_ip, td_path, td_client_id
        from access
        distribute by td_ip
        sort by td_ip,time
      ) t
    ) a
    GROUP BY a.session_id,a.td_client_id
    ORDER BY a.session_id
    ) b
    

    * 출력 결과


    * 해보고 생각하는 것
    - 1일분의 로그를 집계 단위로 하면, 1일에 있어서의 1명의 세션에 관하여 정보를 정리하는 것이 가능.
    - ip가 동일한 것을 세션으로 정의하고 집계합니다. 다른 요소에서도 세션을 정의할 수 있을 것 같다.
    예를 들어, 동일한 사용자 에이전트라는 요소도 추가 할 수 있습니다.

    쉽게 만들 수 있으므로 시도해보십시오.

    좋은 웹페이지 즐겨찾기