BigQuery 테이블 쿼리
이 문서에서는 Managed Service for Apache Spark 워크로드에서 Spark SQL 및 Spark DataFrame API를 사용하여 BigQuery 테이블을 쿼리하는 방법을 설명합니다.
시작하기 전에
API를 사용 설정하고 필요한 경우 Identity and Access Management 역할을 부여합니다.
API 사용 설정
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc and BigQuery APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc and BigQuery APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
Identity and Access Management 역할 부여
이 페이지의 예시를 실행하려면 Managed Service for Apache Spark 및 BigQuery 역할 부여가 필요합니다. 조직 정책에 따라 이러한 역할이 이미 부여되었을 수 있습니다. 역할 부여를 확인하려면 역할을 부여해야 하나요?를 참고하세요.
Managed Service for Apache Spark 역할
기본적으로 배치와 세션은 워크로드 또는 세션에 커스텀 서비스 계정이 지정되지 않는 한 Compute Engine 기본 서비스 계정으로 실행됩니다.
서비스 계정 사용자 역할
일괄 워크로드를 제출하는 데 필요한 권한을 얻으려면 관리자에게 Compute Engine 기본 서비스 계정에 대한 서비스 계정 사용자 (roles/iam.serviceAccountUser) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
Dataproc 작업자 역할
Compute Engine 기본 서비스 계정에 일괄 워크로드를 제출하는 데 필요한 권한이 있는지 확인하려면 관리자에게 프로젝트에 대한 Dataproc 작업자 (roles/dataproc.worker) IAM 역할을 Compute Engine 기본 서비스 계정에 부여해 달라고 요청하세요.
관리자는 커스텀 역할이나 다른 사전 정의된 역할을 통해 Compute Engine 기본 서비스 계정에 필요한 권한을 부여할 수도 있습니다.
BigQuery 역할
Managed Service for Apache Spark 일괄 워크로드 또는 대화형 세션을 실행하는 데 사용되는 서비스 계정에는 다음 리소스에 다음 IAM 역할이 부여되어야 합니다.
다음과 같이 테이블에서 데이터를 읽을 수 있는 BigQuery 데이터 뷰어 (
roles/bigquery.dataViewer)- Spark SQL SELECT 및 INSERT INTO 예시에서 bigquery.DATASET_ID.SOURCE_TABLE에서 읽기
- DataFrame API 예시에서 INFORMATION_SCHEMA에서 읽기
Spark가 BigQuery와 상호작용하는 작업을 실행할 수 있도록 하는 BigQuery 사용자 (
roles/bigquery.user)BigQuery 데이터 편집자 (
roles/bigquery.dataEditor): 데이터를 쓰거나 메타데이터를 쓰려면 다음을 수행합니다.- Spark SQL INSERT INTO 예시의 경우 bigquery.DATASET_ID.DESTINATION_TABLE에 쓰려면
- INFORMATION_SCHEMA를 쿼리하는 DataFrame API 예의 경우 커넥터가 결과를 위한 임시 테이블을 만들 수 있도록
.option('materializationDataset', ...)에 제공된 DATASET_ID에 이 역할이 필요합니다.
Spark 배치 워크로드 제출
Google Cloud 콘솔, Google Cloud CLI 또는 Managed Service for Apache Spark API를 사용하여 Managed Service for Apache Spark 일괄 워크로드를 제출할 수 있습니다.
Spark SQL 사용
Spark BigQuery 카탈로그를 사용하여 일괄 워크로드 또는 대화형 세션에서 표준 BigQuery 테이블을 직접 쿼리할 수 있습니다. 이 방법을 사용하면 PySpark 코드를 작성하거나 DataFrame API를 사용하여 임시 뷰를 만들지 않고도 표준 GoogleSQL 구문을 사용하여 spark-sql 작업 내에서 BigQuery 데이터와 상호작용할 수 있습니다.
BigQuery 카탈로그 구성
BigQuery 카탈로그를 사용 설정하려면 Spark SQL 일괄 워크로드 또는 대화형 세션에 다음 Spark 속성을 제공하세요.
dataproc.sparkBqConnector.version=CONNECTOR_VERSION: Spark BigQuery 커넥터 버전을 지정합니다.spark.sql.catalog.bigquery=com.google.cloud.spark.bigquery.BigQueryCatalog: (선택사항)bigquery카탈로그를 Spark SQL 카탈로그로 등록합니다.
Google Cloud CLI 예:
gcloud dataproc batches submit spark-sql \
--project=PROJECT_ID \
--region=REGION \
--version=RUNTIME_VERSION \
--subnet=SUBNET \
--service-account=SERVICE_ACCOUNT \
--properties="dataproc.sparkBqConnector.version=CONNECTOR_VERSION,spark.sql.catalog.bigquery=com.google.cloud.spark.bigquery.BigQueryCatalog" \
gs://BUCKET/my_query.sql
다음을 바꿉니다.
PROJECT_ID: 프로젝트 ID입니다. 프로젝트 ID는 Google Cloud 콘솔 대시보드의 프로젝트 정보 섹션에 나열됩니다.REGION: 배치가 실행될 리전RUNTIME_VERSION: 선택사항. Managed Service for Apache Spark 런타임 버전 지정하지 않으면 현재 기본 런타임 버전이 선택됩니다.CONNECTOR_VERSION: Spark BigQuery 커넥터 버전입니다.RUNTIME_VERSION와 호환되는 커넥터 버전을 찾으려면 Managed Service for Apache Spark 런타임 출시를 참고하세요. 커넥터가 사전 설치되어 있지 않은 경우 GitHub 출시 페이지에서 사용 가능한 버전을 확인할 수 있습니다.SUBNET: 선택사항. 일괄 워크로드에 사용할 서브네트워크입니다. 지정하지 않으면default서브네트워크가 사용됩니다.SERVICE_ACCOUNT: 선택사항. 일괄 작업이 실행될 서비스 계정입니다. 지정하지 않으면 Compute Engine 기본 서비스 계정이 사용됩니다.BUCKET: SQL 파일이 포함된 Cloud Storage 버킷입니다.
BigQuery 테이블 쿼리
카탈로그를 구성한 후에는 bigquery.DATASET_ID.TABLE_ID 형식을 사용하여 SQL 스크립트에서 BigQuery 테이블을 참조할 수 있습니다.
샘플 SQL 쿼리:
-- Query data from a BigQuery table.
SELECT
column_a,
SUM(column_b)
FROM
bigquery.DATASET_ID.SOURCE_TABLE
WHERE
partition_date = CURRENT_DATE()
GROUP BY column_a;
-- Insert results into another BigQuery table.
INSERT INTO bigquery.DATASET_ID.DESTINATION_TABLE
SELECT column_a, column_b
FROM bigquery.DATASET_ID.SOURCE_TABLE
WHERE column_c = 'some_value';
다음을 바꿉니다.
DATASET_ID: BigQuery 데이터 세트 IDSOURCE_TABLE: 쿼리할 테이블의 ID입니다.DESTINATION_TABLE: 데이터를 삽입할 테이블의 ID입니다.
DataFrame API 사용
INFORMATION_SCHEMA 뷰에 액세스하려면 DataFrame API가 필요합니다.
INFORMATION_SCHEMA를 쿼리하려면 다음 안내를 따르세요.spark.conf.set('viewsEnabled', 'true')을 설정합니다.- 커넥터가 임시 결과를 쓸 수 있도록
.option('materializationDataset', 'DATASET_ID')를 제공합니다.
샘플 PySpark 쿼리:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('BigQuery Info Schema Test').getOrCreate()
# Required for INFORMATION_SCHEMA.
spark.conf.set('viewsEnabled', 'true')
# Query INFORMATION_SCHEMA.TABLES.
info_schema_df = spark.read.format('bigquery') \
.option('project', 'PROJECT_ID') \
.option('materializationDataset', 'DATASET_ID') \
.load(f'SELECT table_name, creation_time FROM `PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.TABLES`')
info_schema_df.show(5, truncate=False)
다음을 바꿉니다.
PROJECT_ID: 프로젝트 ID입니다. 프로젝트 ID는 Google Cloud 콘솔 대시보드의 프로젝트 정보 섹션에 나열됩니다.DATASET_ID: SparkvBigQuery 커넥터가 임시 데이터를 쓸 수 있는 BigQuery 데이터 세트 ID입니다.
표준 BigQuery 테이블에서 데이터를 읽은 다음 결과를 출력 테이블에 쓰는 PySpark 예는 PySpark 워드카운트 배치 워크로드 제출을 참고하세요.
다음 단계
- Spark BigQuery 커넥터에 대해 알아봅니다.
- Managed Service for Apache Spark 할당량을 검토합니다.