콘텐츠로 건너뛰기

위키피디아 데이터를 BigQuery 로 월별 인기 문서 분석하기 (feat. 효율적인 대용량 데이터 처리)

  • 테크

매일같이 쏟아지는 방대한 데이터 속에서 어떻게 의미 있는 신호를 찾아내고 계신가요?

이번 뉴스레터에서는 구글 BigQuery공개 데이터 세트를 활용하여, 수십억 건의 로그가 쌓인 테라바이트(TB)급 데이터를 SQL 쿼리로 분석하고, 그 과정에 담긴 효율적인 대용량 데이터 처리 전략까지 함께 공유하고자 합니다.

인프라 구축이나 데이터 로딩 걱정 없이, 오직 분석 로직과 ‘어떻게 더 빠르고 저렴하게 데이터를 처리할까’에 대한
고민에만 집중하겠습니다.

문제 정의: 월별로 가장 인기 있었던 위키피디아 문서는 어떤 문서일까요?

우리의 목표는 ‘2023년 특정 기간 동안, 매월 어떤 주제가 사람들의 가장 큰 관심을 받았을까?’라는 질문에 답하는 것입니다.
이를 위해 bigquery-public-data.wikipedia 에 저장된 페이지 조회수 데이터를 사용하겠습니다.

쿼리 분석 : 단계별 분석

※ 아래는 월별 최고 인기 문서를 추출하기 위해 작성된 전체 쿼리로, 대용량 데이터를 다루는 몇 가지 핵심적인
효율화 전략을 포함하고 있습니다.

— 월별로 가장 많이 조회된 영어 위키피디아 문서 1건 추출
WITH FILTERED AS (
SELECT DATE_TRUNC(DATE(DATEHOUR), MONTH) AS MONTH
, TITLE
, SUM(VIEWS) AS TOTAL_VIEWS
FROM bigquery-public-data.wikipedia.pageviews_2023
WHERE
TRUE
AND WIKI = ‘en’
AND TITLE NOT IN (‘Main_Page’, ‘-‘)
AND VIEWS > 1000
AND NOT STARTS_WITH(TITLE, ‘Special:’)
AND DATE(DATEHOUR) BETWEEN ‘2023-03-01’ AND ‘2023-06-30’
AND NOT (
DATE_TRUNC(DATE(DATEHOUR), MONTH) IN (‘2023-03-01’, ‘2023-05-01’)
AND TITLE = ‘Deaths in 2023’
)
GROUP BY MONTH, TITLE
),
RANKED AS (
SELECT *
, RANK() OVER (PARTITION BY MONTH ORDER BY TOTAL_VIEWS DESC) AS RNK
FROM
FILTERED
)

SELECT MONTH
, TITLE
, TOTAL_VIEWS
FROM RANKED
WHERE TRUE
AND RNK = 1

ORDER BY MONTH;

효율적인 대용량 데이터 처리 전략 (쿼리 기반)

  1. 데이터 스캔 최소화 (Partition Pruning)
    가장 중요한 최적화는 처리할 데이터의 양을 원천적으로 줄이는 것입니다.

    핵심: WHERE DATE(datehour) BETWEEN ‘2023-03-01’ AND ‘2023-06-30’
    원리: 위키피디아 테이블은 datehour 컬럼을 기준으로 파티셔닝(Partitioning)되어 있습니다. WHERE 절에서 파티션
    키를 명시적으로 필터링하면, BigQuery는 전체 테이블을 스캔하는 대신 필요한 기간(4개월치)의 파티션만 읽어
    옵니다. 1년치 데이터가 아닌 1/3만 스캔하므로 비용과 시간이 크게 절약됩니다.
  2. 처리할 데이터 양 사전 축소 (Early Filtering & Pre-aggregation)
    본격적인 분석(RANK)에 앞서 데이터의 크기를 최대한 줄이는 것이 중요합니다.

    조기 필터링 (Early Filtering)
    : WHERE WIKI = ‘en’, VIEWS > 1000 등은 집계나 조인 전에 불필요한 로우를 제거하여 중간 데이터셋의
    크기를 줄입니다.
    사전 집계 (Pre-aggregation)
    : 첫 번째 CTE에서 GROUP BY 를 사용해 월별, 문서별로 조회수를 미리 합산합니다.
    수십억 건의 원본 로그를 훨씬 작은 크기의 집계 데이터로 변환한 뒤 다음 단계인 RANK()로 넘기기 때문에,
    윈도우 함수가 훨씬 적은 데이터를 대상으로 연산을 수행하게 되어 성능이 극적으로 향상됩니다.
  3. 최적화된 함수 적극 활용 (Optimized Functions)
    핵심: RANK() OVER (PARTITION BY …)
    원리: 윈도우 함수는 복잡한 순위, 비율, 누계 계산을 위해 고도로 최적화되어 있습니다. 과거에 Self-Join 등을 사용해
    구현하던 로직보다 훨씬 적은 리소스로 동일한 결과를 얻을 수 있습니다.
  4. 정렬(ORDER BY)은 신중하게
    핵심: ORDER BY는 최종 단계에서 최소한의 데이터에만 적용합니다.
    원리: 정렬은 매우 비용이 높은 연산입니다. 이 쿼리는 최종 결과인 단 4개의 로우에 대해서만 ORDER BY MONTH 를
    실행합니다. 비용이 많이 드는 ORDER BY TOTAL_VIEWS DESC는 각 월별로 분할된 작은 데이터 묶음(PARTITION
    BY MONTH) 안에서만 효율적으로 실행됩니다.

분석 결과: 2023년 상반기, 세상의 관심사

앞서 살펴본 쿼리의 실행 결과를 통해 분석 할 수 있는 내용은 아래와 같이 당시의 사회적 현상,
즉 생성형 AI의 부상(ChatGPT) 등에 대한 관심을 명확히 보여줍니다.

MONTHTITLETOTAL_VIEWS
2023-03-01YouTube3,678,619
2023-04-01ChatGPT3,490,410
2023-05-01ChatGPT3,170,455
2023-06-01The_Idol_(TV_series)3,644,711

▶ 결론
데이터 엔지니어링은 단순히 데이터를 옮기는 것을 넘어, ‘어떻게 하면 더 빠르고, 저렴하고, 효율적으로 처리할까’를 끊임없이 고민하는 과정이라고 생각합니다. 파티션 활용, 조기 필터링, 사전 집계와 같은 기본 원칙을 지키는 것만으로도 대용량 데이터 처리의 성능과 비용을 획기적으로 개선할 수 있습니다.
BigQuery 와 같은 최신 데이터 웨어하우스는 이러한 최적화 전략을 손쉽게 적용할 수 있는 강력한 도구를 제공합니다. 다음 뉴스레터에서도 데이터 엔지니어 여러분께 실질적인 도움이 될 유용한 주제로 찾아뵙겠습니다.


최신 마케팅/고객 데이터 활용 사례를 받아보실 수 있습니다.

비즈스프링 뉴스레터 구독하기 →

"~에 맞는 제품 추천해줘" 잠재고객은 이제 검색창이 아닌 AI에게 묻습니다. 당신의 브랜드는 AI 대화창에서 추천되고 있습니까?

X