Python으로 BigQuery에 데이터 업로드 & Tableau 연결하기
MongoDB에 적재되어 있는 데이터를 실시간 대시보드로 제작해야 하는 과제가 주어졌다. 실시간까지는 아니더라도 주기적인 업데이트가 가능해야 했고, 다양한 분석이 용이하도록 설계해야만 했다. MongoDB 데이터를 그대로 시각화에 사용할 수 없다는 문제가 있었다.
데이터를 정리하고 가공한 후, SQL 기반의 환경으로 옮겨야 했다. 결국 BigQuery에 적재하고, Tableau와 연동하는 흐름을 구축하는 것이 최선의 방법이었다. 모든 것이 새로운 것 투성이었지만.. 문제를 해결해 나가는 재미도 있었다.
데이터를 효과적으로 분석하고 시각화하려면, 비정형 데이터를 정형화된 분석 환경으로 변환하는 과정이 필수적이다. 특히, NoSQL 데이터베이스인 MongoDB에서 수집된 데이터를 SQL베이스인 BigQuery로 적재한 후, 이를 Tableau와 연동하면 실시간 대시보드를 제작할 수 있다.
이 글에서는 Python을 활용해 데이터를 BigQuery로 업로드하고, Tableau에서 활용하는 과정을 정리했다. GCP 프로젝트 생성부터 데이터 업로드, 시각화까지의 흐름을 따라가며 데이터 파이프라인을 구축한 방법을 기록하였다.
(MongoDB에서 데이터 로드하는 과정은 기록하지 않았다! 참고!)
Airflow같은 자동화 프로그램을 사용하면 더 쉽게 작업할 수 있지만.. 난 이런거 처음 해보기도 했고 리소스도 충분하지 않았기에 우선 자동화 플랫폼은 이용하지 않았다!
GCP 프로젝트 생성하기
Q. 프로젝트?
GCP에서 프로젝트는 리소스를 관리하는 기본 단위로, BigQuery, Cloud Storage, Compute Engine 등의 서비스를 한곳에서 운영할 수 있다. 또한, 사용량과 비용을 개별 프로젝트별로 관리할 수 있어 예산 통제와 무료 크레딧 활용이 용이하다.
우선 Google Cloud Console(https://console.cloud.google.com/)에 로그인한다.
로그인을 하면 아래같은 메인화면이 뜬다.
그러면 왼쪽 상단에 있는 버튼을 눌러준다. 아래 사진에서 빨간색 네모를 누르면 된다.
누른 후 '새 프로젝트'을 클릭한다!
프로젝트 이름 입력 & “만들기” 클릭한다.
만들었으면 BigQuery 활성화를해야한다. Billing 필요하다. 결제 정보 등록 하자! 결제 정보를 등록해야 하지만, 크레딧 소진 전에는 돈이 청구되지 않으니 안심!
(GCP는 신규 가입 시 $300 크레딧 제공 (무료로 사용 가능))
BigQuery 데이터 세트 만들기
Q. 데이터 세트?
BigQuery에서 데이터셋은 테이블을 저장하고 관리하는 논리적 공간이다.
데이터셋을 만들면 프로젝트 내에서 데이터를 체계적으로 분류하고, 접근 권한을 설정할 수 있다.
즉, 데이터셋 없이 테이블을 직접 만들 수 없고, 데이터 세트를 통해 데이터를 더 효율적으로 관리할 수 있다.
다시 Google Cloud Console에 접속한다.
왼쪽 메뉴의 BigQuery를 클릭
클릭하면 '탐색기'아래에 방금 전에 만들었던 프로젝트가 뜬다. 빨간색 네모에 따라서 데이터 세트를 만들어주자.
클릭하면 아래같은 메뉴가 뜰 건데, 데이터 세트 ID는 만들고 싶은 세트 이름으로 지정해준다. 그리고 데이터 세트 만들기 클릭 !
다른 설정들은 잘 모르니 굳이 건들지 않아도 된다 ^_^
참고) python으로 데이터 셋 만들기
python으로도 BigQuery의 데이터셋을 만들 수 있다. 아래 코드를 참조.
from google.cloud import bigquery
client = bigquery.Client()
dataset_id = "프로젝트이름.데이터셋이름" #만들고 싶은 데이터 셋 이름 기입 !
dataset = bigquery.Dataset(dataset_id)
dataset.location = "US" # 지역 설정
# 데이터셋 생성 (이미 존재하면 무시)
dataset = client.create_dataset(dataset, exists_ok=True)
print(f"✅ 데이터셋 {dataset_id} 생성 완료!")
서비스 계정 만들기 (Google Cloud IAM)
pytyon이나 tableau에서 BigQuery에 접근을 하려면 json파일로 된 키가 필요하다. 서비스 계정을 만들어서 키를 다운받아 보자.
똑같이 Google Cloud Console에 접속한다.
방금 생성했던 프로젝트가 선택된 상태에서 탐색 메뉴(왼쪽 상단)를 클릭한다.
IAM 및 관리자 메뉴를 선택한다.
서비스 계정 메뉴를 클릭.
서비스 계정 만들기를 클릭한다.
그리고 서비스 계정 세부정보를 입력해주고, '역할 선택'까지 입력해준다. 그리고 완료 클릭!
다시 '서비스 계정' 메뉴를 클릭한다. 그러면 방금 만든 서비스 계정이 있을 텐데 해당하는 이메일을 클릭.
상단에 있는 '키'탭을 누르고 중간에 있는 '키 추가' 클릭 !
키 유형은 Json으로 선택 후 "만들기"를 클릭하면 자동 저장 된다.
이 파일은 편한 곳으로 옮기면 된다.
Python으로 BigQuery에 접근 및 데이터 업로드 하기
이제 Python으로 BigQuery에 데이터를 업로드 해보자.
우선 방금 다운받은 Json 키 파일을 연결한다. 별도 경로에 저장되었으면 경로까지 입력하면 되지만, 난 ipynb파일이 있는 경로에 저장을 해놓아서 바로 불러왔다.
import os
# Google Cloud 인증
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "your_project.json"
그리고 현재 선택된 프로젝트를 확인한다. 별도 설정한게 없으면 방금 선택했던 프로젝트가 선택되어 있다.
# 현재 선택된 프로젝트 확인
print(f"현재 프로젝트 ID: {client.project}")
프로젝트에 잇는 데이터셋들을 확인한다. 꼭 필요한 과정은 아니나, 어떤 데이터셋들이 있는지 python으로 확인하고 싶을 경우 확인한다.
#연결 테스트
from google.cloud import bigquery
client = bigquery.Client()
datasets = list(client.list_datasets()) # 프로젝트의 모든 데이터셋 가져오기
for dataset in datasets:
print(f"Dataset: {dataset.dataset_id}")
이제 업로드를 해보자. 단 이번 단계의 전제는 데이터 프레임이 준비되어 있다는 점이다. 업로드 하고 싶은 테이블을 준비해주자!
난 리텐션 차트를 만들기 위해서 약간의 전처리를 거쳐 업로드할 테이블을 만들어 놓았다.
전처리가 필요하다면 BigQuery 업로드 이전 단계에서 전처리를 완료하여 데이터프레임형식으로 준비해주면 된다.
업로드를 할 때는 SQL에서 테이블 타입을 정의하듯히 함께 정의하면 된다.
Q. table_id ?
table_id는 BigQuery에서 데이터를 저장할 테이블의 전체 경로(참조 ID)**를 의미
구조: "프로젝트ID.데이터셋ID.(저장할)테이블ID"
[참고 - 내가 업로드한 데이터 프레임 정보]
컬럼명 | 데이터 타입 | 설명 |
userId | STRING | MongoDB의 ObjectId (문자열 변환) |
access_date | TIMESTAMP | 사용자의 접속 시간 |
first_access_date | TIMESTAMP | 사용자의 최초 접속 시간 |
days_since_first_access | INTEGER | 첫 접속 이후 경과 일수 |
# BigQuery 클라이언트 설정
bq_client = bigquery.Client()
table_id = "pickply.pickply_test.user_retention"
# BigQuery로 데이터 업로드 (기존 데이터 덮어쓰기)
job_config = bigquery.LoadJobConfig(
write_disposition="WRITE_TRUNCATE", # 기존 데이터 덮어쓰기
schema=[
bigquery.SchemaField("userId", "STRING"),
bigquery.SchemaField("access_date", "TIMESTAMP"),
bigquery.SchemaField("first_access_date", "TIMESTAMP"),
bigquery.SchemaField("days_since_first_access", "INTEGER"),
],
)
job = bq_client.load_table_from_dataframe(df_retention, table_id, job_config=job_config)
job.result() # 업로드 완료 대기
print(f"✅✅✅ MongoDB → BigQuery 업로드 완료! ✅✅✅ {table_id}")
BigQuery -> Tableau 연결 하기
Tableau를 실행하여 '연결'에서 Google BigQuery를 찾는다.
'서비스 계정으로 로그인'을 선택하고 방금 다운받았던 Json형식의 키를 업로드 하면 된다.
업로드가 성공적으로 되었다. 데이터 집합은 데이터 세트를 의미하며 테이블에 방금 업로드 한 데이터 셋이 잘 업로드 된 모습을 볼 수 있다!