쿼리 실행

쿼리 실행 (Running Queries)

BigQuery에서 쿼리를 실행할 수 있는 방법은 여러 가지예요. 쿼리 잡을 어떤 방식으로 돌릴지에 따라 실행 우선순위가 달라지고, 실행 전 dry run으로 처리할 데이터량을 미리 확인할 수도 있어요. 여기서는 쿼리 잡의 종류와 실행 방법, 그리고 실행에 필요한 권한을 정리해 볼게요.

출처: Run a query

쿼리 잡의 종류

BigQuery 쿼리 잡은 실행 방식에 따라 세 가지로 나뉘어요.

  • 대화형 쿼리 잡 (Interactive query jobs): 기본값이에요. 가능한 한 빨리 실행을 시작하도록 설계된 쿼리예요.
  • 배치 쿼리 잡 (Batch query jobs): 대화형보다 우선순위가 낮아요. 프로젝트나 예약이 가용 컴퓨팅 리소스를 전부 쓰고 있으면 배치 쿼리는 큐에 오래 머무를 가능성이 커요. 일단 실행되기 시작하면 대화형 쿼리와 똑같이 동작해요.
  • 연속 쿼리 잡 (Continuous query jobs): 쿼리가 계속 실행되며 들어오는 데이터를 실시간으로 분석하고, 결과를 BigQuery 테이블에 쓰거나 Bigtable·Pub/Sub로 내보낼 수 있어요. 실시간 ML 추론 적용이나 이벤트 기반 데이터 파이프라인 구축 같은 시간에 민감한 작업에 쓸 수 있어요.

쿼리 잡을 실행하는 방법은 콘솔에서 쿼리를 작성·실행하는 것, bq query 명령을 쓰는 것, REST API의 jobs.query·jobs.insert 메서드를 호출하는 것, 클라이언트 라이브러리를 쓰는 것 등이 있어요.

쿼리 결과는 기본적으로 임시 테이블에 저장되지만, 영구 테이블을 대상으로 지정할 수도 있어요. 영구 테이블을 결과 대상으로 정하면 기존 테이블에 추가(append)·덮어쓰기(overwrite)하거나 고유 이름으로 새 테이블을 만들지 고를 수 있어요.

쿼리 실행에 필요한 권한

쿼리 잡을 실행하려면 관리자에게 다음 IAM 역할을 부여받아야 해요.

  • 프로젝트에 대한 BigQuery Job User(roles/bigquery.jobUser)
  • 쿼리가 참조하는 모든 테이블·뷰에 대한 BigQuery Data Viewer(roles/bigquery.dataViewer). 뷰를 쿼리할 때는 그 아래 모든 기본 테이블·뷰에도 이 역할이 필요해요. 승인된 뷰나 승인된 데이터셋을 쓰면 기본 소스 데이터에 대한 접근은 필요 없어요.

구체적으로 필요한 권한은 두 가지예요.

  • bigquery.jobs.create — 데이터가 어디에 저장돼 있든, 쿼리를 실행하는 프로젝트에 대한 권한
  • bigquery.tables.getData — 쿼리가 참조하는 모든 테이블·뷰에 대한 권한

흔한 오류

 Access Denied: Project [project_id]: User does not have bigquery.jobs.create permission in project [project_id].

이 오류는 주체(principal)가 프로젝트에서 쿼리 잡을 만들 권한이 없을 때 생겨요. 관리자가 쿼리하는 프로젝트에 bigquery.jobs.create 권한을 부여하면 해결돼요. 이 권한은 쿼리 데이터 접근에 필요한 권한에 더해 필요한 것이에요.

대화형 쿼리 실행

콘솔

  1. BigQuery 페이지로 이동해요.
  2. SQL query를 클릭해요.
  3. 쿼리 편집기에 유효한 GoogleSQL 쿼리를 입력해요. 예를 들어 BigQuery 공개 데이터셋 usa_names에서 1910년부터 2013년까지 미국에서 가장 흔한 이름을 알아본다면 이런 쿼리를 쓸 수 있어요.
SELECT name, gender, SUM(number) AS total
FROM `bigquery-public-data.usa_names.usa_1910_2013`
GROUP BY name, gender
ORDER BY total DESC
LIMIT 10;
  1. Run을 클릭해요. 대상 테이블을 지정하지 않으면 쿼리 결과는 임시(캐시) 테이블에 저장돼요.

bq

Cloud Shell을 열고 bq query 명령을 사용해요. --use_legacy_sql=false 플래그는 GoogleSQL 문법을 쓰게 해줘요.

bq query --use_legacy_sql=false \
  'SELECT name, gender, SUM(number) AS total
   FROM `bigquery-public-data.usa_names.usa_1910_2013`
   GROUP BY name, gender
   ORDER BY total DESC
   LIMIT 10;'

결과를 기존 테이블에 쓰려면 위치(location)와 대상 테이블을 지정해요. 기존 테이블에 추가하려면 --append_table=true, 덮어쓰려면 --replace=true 플래그를 써요.

bq query --location=LOCATION --destination_table=TABLE --use_legacy_sql=false 'QUERY'

--destination_table을 지정하지 않으면 쿼리 결과가 임시 테이블에 저장돼요.

Python (dry run)

dry run은 쿼리를 실제로 실행하지 않고 처리할 데이터량을 추정해 보는 방법이에요. Python 클라이언트에서는 QueryJobConfig.dry_run 속성을 True로 설정하면 돼요. Client.query()는 dry run 쿼리 설정이 주어지면 항상 완료된 QueryJob을 반환해요.

더 알아보기