본문 바로가기
Project

[블로그프로젝트#13] 빅쿼리 raw event 데이터 추출하기(.csv)

by yj-data 2026. 4. 7.

이전 글:

2026.04.01 - [Project] - [블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기

 

[블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기

어떤 데이터가 쌓이고 있는지 확인해보자. 1. 데이터 항목 확인하기 필드 이름유형모드설명키대조기본값정책태그데이터 정책세부내용 event_dateSTRINGNULLABLE------이벤트 생성일 event_timestampINTEGERNULL

yj-data.tistory.com


마스터 테이블 만들기

 

1. 마스터 테이블에 들어갈 데이터 선택

이전 글에서 BigQuery Export에서 볼 수 있는 데이터를 나열 했으니, 이 데이터 중 내가 분석에 사용할 '마스터 테이블'로 뽑을 정보를 찾아보았다. 

기본필드 user_pseudo_id, event_date, event_timestamp, event_name, batch_event_index
event_params.key. ga_session_id, batch_ordering_id, batch_page_id, page_title, page_referrer
session_traffic_source_last_click.manual_campaign. source, medium
session_traffic_source_last_click.cross_channel_campaign. default_channel_group
geo. country
device. category, operating_system

 

일단 이 정도가 있으면 어느정도 분석은 가능할 듯 하다.

 

 

2. 데이터는 어떤 확장자로? : .csv vs .parquet

csv에 비해 parquet이 파일 크기도 작고, 읽기 속도도 빠르다. 그러나 태블로 퍼블릭 유저로서(Power BI 미숙) parquet을 사용하려면 csv나 hyper 로 변환 후 사용이 가능하기 때문에ㅠㅠ csv로 추출하기로 결정했다.

 

3. 빅쿼리 raw event - flat table 만들기

현재 내 데이터는 아래 부분(event_params)만 제외하면 모두 단일 행 데이터이기 때문에, 이 부분만 값을 추출해서 사용하기로 했다.

 

여기서 주의사항

  • 몇십개 되는 컬럼을 그대로 두고 flatten 하면 데이터 양이 커질 것이다.
  • 어차피 사용할 컬럼은 <1. 마스터 테이블에 들어갈 데이터 선택> 에서 선택을 완료했다.
  • 따라서 event_params에 해당하는 5개 변수만 unnest하고 나머지는 그대로 뽑아주자. 형식은 flat table형식으로.

 

쿼리작성 test

SELECT
    event_date,
    
    (SELECT ep.value.int_value
    FROM UNNEST(event_params) AS ep
    WHERE ep.key = 'ga_session_id') AS session_id
    
FROM `analytics_526092412.events_20260328`;

 

시범으로 unnest에 들어가는 변수와 들어가지않는 변수를 하나씩 선택해서 추출해봤다. 

  • SELECT 뒤에 ep.value 까지 써줘도 되지만, int_value라고 지정해주면 쿼리가 데이터를 덜먹는다. 저런식으로 써주는 이유는 스키마가 아래와 같기 때문이다.

  • 테스트이므로 가장 작은 테이블로 테스트해봤다.

얼마나 데이터를 먹는지 표시해줘서 좋다. 앞에 event_date 추가해도 1kb정도 추가되므로 부담없이 쿼리 ㄱㄱ.

 

그리고 하나를 더 unnest 해봤더니..??

잡아먹는 메모리는 그대로..!! 오오..역시 한번만 연산하면 된다 이건가.

 

테스트 결과

총 53행이고 그 중에 9개만 뽑아서 스샷을 찍었다.

 

flat table화가 완료되었다. 원래 53행이었고, 각 행 당 event_params가 잔뜩 붙어있었는데, 최종적으로 이렇게 event_params가 각 행 별로 풀려나온다.

 

최종 쿼리

기본필드 user_pseudo_id, event_date, event_timestamp, event_name, batch_event_index
session_traffic_source_last_click.manual_campaign. source, medium
session_traffic_source_last_click.cross_channel_campaign. default_channel_group
geo. country
device. category, operating_system
event_params.key. ga_session_id, batch_ordering_id, batch_page_id, page_title, page_referrer

 

SELECT
  user_pseudo_id,
  event_date,
  TIMESTAMP_MICROS(event_timestamp) AS event_time,
  event_name,
  batch_event_index,

  session_traffic_source_last_click.manual_campaign.source,
  session_traffic_source_last_click.manual_campaign.medium,
  
  session_traffic_source_last_click.cross_channel_campaign.default_channel_group,

  geo.country,
  
  device.category,
  device.operating_system,

  (SELECT ep.value.int_value
  FROM UNNEST(event_params) AS ep
  WHERE ep.key = 'ga_session_id') AS session_id,

  (SELECT ep.value.int_value
  FROM UNNEST(event_params) AS ep
  WHERE ep.key = 'batch_ordering_id') AS batch_ordering_id,

  (SELECT ep.value.int_value
  FROM UNNEST(event_params) AS ep
  WHERE ep.key = 'batch_page_id') AS batch_page_id,

  (SELECT ep.value.string_value
  FROM UNNEST(event_params) AS ep
  WHERE ep.key = 'page_title') AS page_title,

  (SELECT ep.value.string_value
  FROM UNNEST(event_params) AS ep
  WHERE ep.key = 'page_referrer') AS page_referrer

FROM `analytics_526092412.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260327' AND '20260430';

 

4. 데이터 다운받기

결과창에서 결과 저장 클릭 > csv 로컬로 다운받기 선택.

로컬 태블로 퍼블릭에서 돌릴거라서 이렇게 선택했다.

(참고로 파일 크기는 사용하는 메모리 대비 50%정도 크기로 나오는 듯 하다. 400kb정도 쿼리 때 사용하면 다운받은 파일 크기는 200kb정도로 찍힌다.)


다음 글은 태블로로 분석하는 내용에 대해 작성할 예정이다.✨