본문 바로가기
CSP (Cloud Service Provider)/GCP

Bigquery Table 속성 일괄 수정

by BTC_최총무 2023. 12. 27.

베하~ 반갑습니다!!

 

인사통의 BTC_김회장, 최총무입니다!!

 

 

오늘은 Bigquery Table를 일괄 수정하는 방법을 함께 배워나갈거에요~

 

업무적으로 되게 자주 사용하게 될 내용이니 꼭 익혀가시길 바래요!!


Table 속성 수정하기

아마 익숙하지 않은 상태로 처음 이 과제를 받게 되면 콘솔을 먼저 살펴보시게 될거에요!

하지만 처음 수정을 위해 table의 세부정보를 수정하려하면 수정할 수 있는 항목이 적어서 당황하실거에요..

하지만 만약 파티션 기준이나 Clustering field와 같은 내용을 고치고 싶다면 어떻게 해야 할까요?

 

이때는 Alter table 명령어를 사용해서 수정할 수 있습니다.

ALTER TABLE mydataset.mytable
  SET OPTIONS (
    description = 'Description of mytable');

 

참고로 Clustering field의 경우는 Alter table로 사용할 수 없어 권한이 충분한곳에서 bq update문을 사용해야 합니다!!

bq update --clustering_fields=[FIELD1],[FIELD2] project_id:dataset.table

 

더욱 자세한 내용은 아래 Docs를 참고하면 쉽게 따라하실 수 있습니다!!

 

테이블 관리  |  BigQuery  |  Google Cloud

BigQuery에서 테이블을 관리하는 방법을 보여줍니다. 즉 테이블의 이름을 바꾸고, 복사하고, 삭제하는 방법, 해당 속성을 업데이트하고 삭제된 테이블을 복원하는 방법입니다. 콘솔, bq 명령줄 도

cloud.google.com


Table 일괄 수정하기

만약 특정 dataset에 있는 특정 table들의 속성을 일괄적으로 수정해야한다면 어떻게 해야 할까요?

쿼리를 테이블 갯수만큼 하나하나 실행하는건 너무 번거롭고 시간이 오래 걸릴텐데요..

이럴때는 VM 등에서 Python 코드 등을 활용해서 if문을 사용해서 작성하는것이 편리합니다!!

아래는 Information schema와 bq update문을 활용하여 특정 dataset 리스트 중 daily로 끝나는 테이블을 찾아 Clustering field를 수정하는 코드입니다!!

IF문을 활용해서 기존에 clustering이 설정되어있다면 해당 내용도 유지하도록 하였구요

from google.cloud import bigquery
from subprocess import call

# 검사할 데이터셋 리스트
datasets = <['적용 dataset', '적용 dataset']>
project_id = <'적용 project_id'>
new_cluster_field = <'적용할 cluster_field 값'>

# BigQuery 클라이언트 초기화
client = bigquery.Client(project=project_id)

for dataset in datasets:
    # 데이터셋 내의 모든 테이블을 나열
    query = f"""
    SELECT table_name
    FROM `{project_id}.{dataset}.INFORMATION_SCHEMA.TABLES`
    WHERE table_name LIKE '%_daily'
    """
    query_job = client.query(query)

    for row in query_job:
        table_name = row.table_name
        table_id = f"{dataset}.{table_name}"

        # 테이블 메타데이터 가져오기
        table = client.get_table(table_id)

        # 클러스터링 필드 설정 확인 및 출력
        if table.clustering_fields:
            clustering_fields = [new_cluster_field] + list(table.clustering_fields)
            print(f"{table_id}: Existing clustering fields - {table.clustering_fields}, New clustering fields - {clustering_fields}")
        else:
            clustering_fields = [new_cluster_field]
            print(f"{table_id}: No existing clustering fields, New clustering fields - {clustering_fields}")



        # 클러스터링 필드 업데이트 실행
        clustering_fields_str = ",".join(clustering_fields)
        bq_command = f"bq update --clustering_fields={clustering_fields_str} {table_id}"
        call(bq_command, shell=True)

해당 코드와 같이 bq update과 반복문을 활용해서 편리하게 수정할 수 있겠네요!!

아래 업데이트문을 제외하고 print를 일부 수정하면 clustering field가 있는 테이블만 print 하는 등 여러가지로 고쳐 사용할 수 있겠죠?


오늘 함께 한 실습은 여기까지 입니다!!

 

제가 예제로 드린 코드를 활용해주셔도 되고 형태가 다르게 짜보셔도 됩니다!!

2023년도 이제 얼마남지 않았네요 모두들 한 해 마무리 잘 되고 계신가요?

다들 한해 마무리 잘하시고 내년도 행복한 한해 되시길 바랍니다~

모두 베빠!

'CSP (Cloud Service Provider) > GCP' 카테고리의 다른 글

Duet AI Bigquery 활용  (1) 2024.01.05
Cloud Build란?  (1) 2024.01.03
[GCP] Organization Policy  (0) 2023.12.26
App Engine과 각 언어 환경  (0) 2023.12.22
Resource에 Service Account 연결  (0) 2023.12.08

댓글