BigQuery에서 배열 다루기: 실무 활용법
1. 왜 BigQuery에서 배열을 다루는가?
BigQuery에서는 종종 **중첩된 구조(Nested Structure)**의 데이터를 다룰 때가 많습니다. 예를 들어:
- GA4, AppsFlyer, CRM 이벤트 로그: 한 사용자 이벤트에 여러 속성(파라미터)이 배열로 담깁니다.
- 제품 주문 정보: 한 주문에 여러 상품이 포함될 수 있습니다.
- 설문조사 데이터: 한 응답자가 여러 선택지를 고를 수 있습니다.
이처럼 반정규화된 형태의 데이터를 효율적으로 처리하기 위해 배열을 사용합니다.
2. 배열 관련 주요 함수
함수명 | 설명 |
---|---|
ARRAY() | 배열 생성 |
UNNEST() | 배열을 테이블 형태로 펼침 (필수!) |
ARRAY_LENGTH() | 배열의 길이 반환 |
ARRAY_AGG() | 그룹 내 값을 배열로 집계 |
ARRAY_TO_STRING() | 배열을 문자열로 변환 |
SAFE_OFFSET() | 배열 인덱스로 값 접근 (NULL-safe) |
SAFE_ORDINAL() | 배열 순서로 값 접근 (1부터 시작, NULL-safe) |
GENERATE_ARRAY() | 숫자 범위 배열 생성 |
3. 예시 데이터 생성
WITH orders AS (
SELECT 1 AS order_id, ['Apple', 'Banana', 'Cherry'] AS products UNION ALL
SELECT 2 AS order_id, ['Durian'] AS products UNION ALL
SELECT 3 AS order_id, ['Elderberry', 'Fig'] AS products
)
- order_id: 주문 번호
- products: 주문된 상품들의 배열
4. 실전 예제 쿼리
4-1. 배열을 펼쳐서 각 상품별로 조회하기
WITH orders AS (
SELECT 1 AS order_id, ['Apple', 'Banana', 'Cherry'] AS products UNION ALL
SELECT 2 AS order_id, ['Durian'] AS products UNION ALL
SELECT 3 AS order_id, ['Elderberry', 'Fig'] AS products
)
SELECT
order_id,
product
FROM
orders,
UNNEST(products) AS product
결과:
order_id | product |
1 | Apple |
1 | Banana |
1 | Cherry |
2 | Durian |
3 | Elderberry |
3 | Fig |
4-2. 배열의 길이 구하기
WITH orders AS (
SELECT 1 AS order_id, ['Apple', 'Banana', 'Cherry'] AS products UNION ALL
SELECT 2 AS order_id, ['Durian'] AS products UNION ALL
SELECT 3 AS order_id, ['Elderberry', 'Fig'] AS products
)
SELECT
order_id,
ARRAY_LENGTH(products) AS product_count
FROM
orders
결과:
order_id | product_count |
1 | 3 |
2 | 1 |
3 | 2 |
4-3. 특정 인덱스 값 조회하기 (첫 번째 상품)
WITH orders AS (
SELECT 1 AS order_id, ['Apple', 'Banana', 'Cherry'] AS products UNION ALL
SELECT 2 AS order_id, ['Durian'] AS products UNION ALL
SELECT 3 AS order_id, ['Elderberry', 'Fig'] AS products
)
SELECT
order_id,
SAFE_OFFSET(products, 0) AS first_product
FROM
orders
결과:
order_id | first_product |
1 | Apple |
2 | Durian |
3 | Elderberry |
5. 실무에서의 활용 시나리오
시나리오 1: GA4 이벤트 파라미터 분석
- 상황: GA4 이벤트 로그에는
event_params
라는 배열이 있어 각 이벤트별로 다양한 파라미터가 담겨 있음. - 목표: 특정 이벤트에서 ‘page_location’ 파라미터 값을 가져오고 싶을 때
UNNEST()
와WHERE
을 조합하여 활용.
SELECT
event_name,
param.value.string_value AS page_location
FROM
`my_project.my_dataset.events_*`,
UNNEST(event_params) AS param
WHERE
event_name = 'page_view'
AND param.key = 'page_location'
시나리오 2: 주문 데이터에서 인기 상품 집계
- 상황: 한 주문에 여러 상품이 포함되어 있는 경우.
- 목표: 모든 주문에서 가장 많이 팔린 상품을 집계.
WITH orders AS (
SELECT 1 AS order_id, ['Apple', 'Banana', 'Cherry'] AS products UNION ALL
SELECT 2 AS order_id, ['Durian'] AS products UNION ALL
SELECT 3 AS order_id, ['Apple', 'Fig'] AS products
)
SELECT
product,
COUNT(*) AS sales_count
FROM
orders,
UNNEST(products) AS product
GROUP BY
product
ORDER BY
sales_count DESC
결과:
product | sales_count |
Apple | 2 |
Banana | 1 |
Cherry | 1 |
Durian | 1 |
Fig | 1 |
6. Focus keyphrase, slug, meta description
- Focus keyphrase: BigQuery 배열 함수 사용법
- slug: bigquery-array-functions
- meta description: BigQuery에서 배열을 다루는 이유와 주요 함수 사용법을 실무 예제와 함께 상세히 설명합니다. GA4 이벤트 분석, 주문 데이터 집계 등 실제 업무에 바로 적용할 수 있는 쿼리 예제 포함.
답글 남기기