베하~ 반갑습니다!!
인사통의 BTC_김회장, 최총무입니다!!
오늘은 Bigquery View를 일괄 수정하는 방법을 함께 배워나갈거에요~
혹시 View에 대해 익숙하지 않은분은 아래 포스팅을 먼저 확인해주세요!!
View query의 쿼리 수정
이전 포스팅에서 View는 SQL 쿼리를 저장하여 다른 테이블의 데이터를 참조할 수 있는 기능이라고 말씀 드렸죠?
아마 테스트가 아닌 실제 환경에서는 이러한 View의 내용을 일괄 수정해야하는 일이 있을 수 있어요
저번에 말씀드렸듯 권한별로 Dataset을 설정해서 원본 데이터가 아닌 View 쿼리를 통해 원하는 정보만을 보여줄 수 있는게 View의 큰 장점인데요 만약 이 View에서 특정 정보가 중요해져서 정보를 숨겨야한다면 어떻게 해야 할까요?
모든 View를 눌러서 하나하나 쿼리 수정을 해야할까요?
오늘은 이런 불편함을 줄이기 위해 코드를 작성해서 일괄로 수정하는 작업을 진행해보겠습니다!!
사전 준비
작업은 vm instance를 사용해서 진행하겠습니다.
기본적인 테스트환경에서는 Editor 권한이 있어 문제되지 않지만 만약 최소권한이 할당된 환경인 경우에는
Bigquery에 대한 수정권한 및 해당 데이터셋에 대한 권한등이 필요할 수 있겠네요
제가 간단히 작성한 코드는 다음과 같습니다.
전체 dataset을 순회하며 전체 view의 쿼리를 찾아 중복을 검사 후 중복 없는경우 수정하도록 하는 python 코드이구요
Bigquery client를 활용해서 where 조건 뒤에 특정 조건을 추가하는 방식으로 작성하였습니다!!
하지만 기존 코드에 where가 있는경우와 없는 경우가 있기 때문에 if를 통해 순차적으로 수정하도록 했습니다.
from google.cloud import bigquery
# BigQuery 클라이언트 초기화
client = bigquery.Client()
# 수정할 데이터셋 리스트
dataset_list = ["{dataset list}"]
# 분할할 지점 지정
split_point = "union all"
# 추가할 where 조건
add_where_text = "{추가해야할 where 조건내용}"
# where 존재 시 추가할 조건
add_and_text = "{where 존재 시 추가할 조건내용 (and)}"
# 검색할 텍스트
search_where = "where"
search_text = "{추가할 내용}"
# 각 데이터셋을 순회
for dataset_id in dataset_list:
# 데이터셋 내의 테이블 리스트
table_list = client.list_tables(dataset_id)
table_name_list = []
for table in table_list:
table_name_list.append("{pj}.{ds}.{tb}".format(pj=table.project, ds=table.dataset_id, tb=table.table_id))
# 각 테이블(뷰)을 순회
for table in table_name_list:
view = client.get_table(table)
# 뷰의 쿼리가 존재하는 경우
if view.view_query:
split_query = view.view_query.split(split_point)
# 쿼리를 분할하여 조건에 따라 수정
if len(split_query) == 2:
if search_where not in split_query[0] and search_where not in split_query[1]:
view.view_query = '{sp1} {add_w} {split_point} {sp2} {add_w}'.format(sp1=split_query[0].strip(), sp2=split_query[1].strip(), add_w=add_where_text, split_point=split_point)
client.update_table(view, ["view_query"])
print(f"Updated {table}")
elif search_text not in split_query[0] and search_text not in split_query[1]:
view.view_query = '{sp1} {add} {split_point} {sp2} {add}'.format(sp1=split_query[0].strip(), sp2=split_query[1].strip(), add=add_and_text, split_point=split_point)
client.update_table(view, ["view_query"])
print(f"Updated {table}")
else:
print(f"{table} already has search_data")
else:
print(f"{table} pass")
위 코드는 제 테스트 환경이 union 형태로 view가 되어있어 union all 기준으로 split을 통해 해당 형태 뷰만 수정하도록 작성하였습니다.
혹시 조건이 다르다면 split point와 length를 통해 if를 잡는 부분을 고쳐주시면 되겠네요!
오늘 함께 한 실습은 여기까지 입니다!!
제가 예제로 드린 코드를 활용해주셔도 되고 형태가 다르게 짜보셔도 됩니다!!
저는 Excel에 익숙해서 if를 활용해서 작성했지만 다른 좋은 방법이 있다면 댓글 등으로 적어주셔도 좋을것 같습니다
제가 코드를 짜면서 가장 도움이 된 Tip은 "print를 자주 넣자" 입니다.
그렇게 하면 어디까지 진행이 되었는지 어떤 형태로 다음 단계로 넘어 갔는지 알 수 있어요
이번 코드를 짜면서 의도대로 동작할때마다 print를 하나씩 지워나가는 재미도 있었습니다!!
그럼 오늘도 고생 많으셨습니다!!
다음에도 운영환경에 맞는 다양한 정보를 가지고 찾아오겠습니다!!
모두 베빠~
'CSP (Cloud Service Provider) > GCP' 카테고리의 다른 글
보안 웹 프록시란(secure-web-proxy)? (0) | 2023.11.23 |
---|---|
GKE Upgrade 방식 (0) | 2023.11.20 |
GCP의 Cloud Web Security Center를 활용하여 클라우드 보안 강화하기 (0) | 2023.11.09 |
Bigquery View 관리 (0) | 2023.10.27 |
Quotas (0) | 2023.10.27 |
댓글