이전 글:
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 해봤더니..??

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

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정도로 찍힌다.)
다음 글은 태블로로 분석하는 내용에 대해 작성할 예정이다.✨
'Project' 카테고리의 다른 글
| [SaaS프로젝트#1] 프로젝트 기획: 서비스 선정, 핵심 질문 선정, 서비스 화면 구성(AI로 생성) (0) | 2026.04.04 |
|---|---|
| [블로그프로젝트#12] BigQuery Export로 쌓은 raw event 살펴보기 (0) | 2026.04.02 |
| [블로그프로젝트#11] BigQuery Export로 GA raw event 수집하기 (성공!!) (0) | 2026.03.30 |
| [블로그프로젝트#9] GA 데이터 검수하기 Part 1. utm 유입 확인 (0) | 2026.03.25 |
| [블로그 프로젝트#8] GTM으로 블로그 내부 이동 추적하기 (0) | 2026.03.20 |