본문 바로가기

Data & MarTech

[BigQuery] 파이썬 라이브러리를 활용한 빅쿼리 연동 - 2. 빅쿼리 클라이언트 선언 및 조회 기능 구현

반응형

빅쿼리 클라이언트 연동 구현

빅쿼리 라이브러리를 초기화할 경우 앞서 생성 및 다운로드한 서비스 계정(Service Account)가 필요합니다. 저는 로컬 개발환경에서 필요시에만 서비스 계정을 사용하기 위해 '명시적'으로 json 파일을 임포트하도록 구현하는 방식을 사용합니다. 

1. 프로젝트에 서비스 계정 파일 복사하기

  • service_account_for_bq_tutorial.json 파일을 테스트 중인 biquery_tutorial 프로젝트에 추가합니다.
  • json파일은 다운로드 후 개발 시 인지할 수 있는 이름으로 변경하였습니다.

서비스 계정 파일

2. BigQuery 클라이언트 선언하기

service_account_file 경로 및 파일명을 선언하고 bigquery.Client.from_srvice_account_json 함수로 임포트합니다.

1) 공식문서 가이드 문서 링크

공식문서에서는 아래와 같이 service_account 모듈을 활용하는 것을 권장합니다.
from google.cloud import bigquery
from google.oauth2 import service_account

# TODO(developer): Set key_path to the path to the service account key
#                  file.
# key_path = "path/to/service_account.json"

credentials = service_account.Credentials.from_service_account_file(
    key_path, scopes=["https://www.googleapis.com/auth/cloud-platform"],
)

client = bigquery.Client(credentials=credentials, project=credentials.project_id,)
 

서비스 계정 키 파일로 인증  |  BigQuery  |  Google Cloud

의견 보내기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 서비스 계정 키 파일로 인증 온프레미스 또는 다른 퍼블릭 클라우드에 애플리케이션을 배포할

cloud.google.com

2) 구현 코드 예시

해당 코드에서는 bigquery 모듈에서 제공하는 from_service_account_json 함수를 이용하여 빅쿼리 클라이언트를 선언하였습니다.
from google.cloud import bigquery, storage
from datetime import datetime

class BqUtils:
	service_account_filename = 'service_account_for_bq_tutorial.json'

	def __init__(self):
    	# Import the Service Account Explicitly
		self.bqClient = bigquery.Client.from_service_account_json(self.service_account_filename)

3) 서비스 계정 초기화 코드간 차이점

구글에서 제공하는 샘플소스와 제가 사용한 빅쿼리 클라이언트 간의 서비스계정 연동구현간의 차이점을 요약하면 다음과 같습니다. 

biquery.Client.from_service_account_json의 경우 빅쿼리 클라이언트 라이브러리에서 제공하는 함수로 빅쿼리 클라이언트 객체를 직접 생성하는 방식입니다. 따라서 해당 함수는 빅쿼리 클라이언트 초기화시에만 사용이 가능합니다. 이에 반해 구글 문서에서 제공하는 service_account.Credentials.from_service_account_file의 경우 Google Auth Libary에서 제공하는 인증 객체를 생성하는 공통함수로 BigQuery를 포함한 구글 클라우드 서비스에 모두 활용이 가능합니다. 

 

3. 빅쿼리 데이터 연동

1) 빅쿼리 데이터 조회

빅쿼리 조회할 테이블을 확인합니다. 참고로 빅쿼리의 경우 Project, Dataset, Table의 계층구조를 갖고 있고, 데이터 조회시에도 해당 계층정보를 선언해야 합니다.

빅쿼리 계층구조

 

빅쿼리 프로젝트 생성시 위 그림과 같이 bigquery-public-data라는 샘플데이터가 있습니다. 이번 테스트를 위해 해당 프로젝트 데이터를 활용하여 조회를 구현해보겠습니다. 저는 baseball이란 Dataset에 있는 schedules라는 Table을 빅쿼리 클라이언트를 통해 조회하도록 선언하였습니다.

2) 구현 코드 예시

2-1) Python 함수를 활용한 조회

Python 라이브러리를 활용하여 몇가지 조회조건을 추가하였습니다.

  • 전체 row 카운트 확인
  • LIMIT 조회
  • 특정 컬럼 조회
  • 특정 인덱스 부터 n개의 데이터 조회
def getDataFromTable(self,project='bigquery-public-data',dataset='baseball',table='schedules'):
        dataset_ref = self.bqClient.dataset(dataset, project=project)
        table_ref = dataset_ref.table(table)
        table = self.bqClient.get_table(table_ref)  # API call

        # Load all rows from a table
        rows = self.bqClient.list_rows(table)
        assert len(list(rows)) == table.num_rows

        # Load the first 10 rows
        rows = self.bqClient.list_rows(table, max_results=10)
        assert len(list(rows)) == 10

        # Specify selected fields to limit the results to certain columns
        fields = table.schema[:2]  # first two columns
        rows = self.bqClient.list_rows(table, selected_fields=fields, max_results=10)
        assert len(rows.schema) == 2
        assert len(list(rows)) == 10

        # Use the start index to load an arbitrary portion of the table
        rows = self.bqClient.list_rows(table, start_index=10, max_results=10)

        # Print row data in tabular format
        format_string = '{!s:<16} ' * len(rows.schema)
        field_names = [field.name for field in rows.schema]
        print(format_string.format(*field_names))  # prints column headers
        for row in rows:
            print(format_string.format(*row))      # prints row data

조회결과

10번째 인덱스부터 10개의 데이터 조회

 

2-2) 구현코드 예시

# 쿼리를 활용한 빅쿼리 조회
def get_game_list(self):
        # client = bigquery.Client.from_service_account_json(self.service_account_filename)
        query_job = self.bqClient.query("""
            SELECT gameId, gameNumber, year, type, dayNight FROM `bigquery-public-data.baseball.schedules`
            ORDER BY gameId ASC
            LIMIT 10""")
        
        rows = query_job.result()

        # Get the schema from the query result
        schema = rows.schema

        # Add column names
        column_names = [field.name for field in schema]
        format_string = '{!s:<16} ' * len(rows.schema)

        # prints column headers
        print(format_string.format(*column_names))  

        # prints row data
        for row in query_job:
            print(format_string.format(*row))

 

마치며

빅쿼리 클라이언트에서 제공하는 함수를 활용하여 구현할 경우 비즈니스에 필요한 조회기능을 구현하는 용도로 활용할 수 있습니다. 예를 들어 빅쿼리 클라이언트를 활용하여 대시보드 또는 리포트 조회용으로 구현하거나, 조회한 데이터를 Pandas DataFrame으로 전환하여 데이터 전처리 또는 시각화를 추가로 진행하는 것이 가능합니다. 빅쿼리는 단순 조회용이 아닌 Machine Learning, Realtime 데이터 분석용으로도 활용이 가능하므로, 기본적인 빅쿼리 클라이언트 제공기능을 숙지한 다음 비즈니스 필요에 따라 활용할 것을 권장드립니다.

 


참고자료

1. 구글 인증(Authentication at Google)

Service accounts are accounts that do not represent a human user. They provide a way to manage authentication and authorization when a human is not directly involved, such as when an application needs to access Google Cloud resources. Service accounts are managed by IAM.
 

Google에서 인증  |  Google Cloud

의견 보내기 Google에서 인증 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 문서에서는 일부 키 인증 개념을 이해하고 인증 구현 또는 문제 해결 도움말

cloud.google.com

2. Configuring Authentication with a Service Account Key File

 

Python Programming with Google BigQuery – Page 5 – Holowczak.com Tutorials

Configuring Authentication with a Service Account Key File There are a number of ways to inform a Python program about the Service Account Key File needed to authenticate with Google BigQuery. Set up the GOOGLE_APPLICATION_CREDENTIALS environment variable

holowczak.com

3. Export Query Result from BigQuery to Google Cloud Storage using Python

 

Export Query Result from BigQuery to Google Cloud Storage using Python

This tutorial guides you to programmatically export your query results to Google Cloud Storage.

kashif-sohail.medium.com

4. pypi google-cloud-bigquery

 

google-cloud-bigquery

Google BigQuery API client library

pypi.org

5. Getting Started with Google BigQuery API in Python

 

반응형