교차 클라우드 운영으로 데이터 로드
BigQuery 관리자 또는 분석가는 Amazon Simple Storage Service(Amazon S3) 버킷 또는 Azure Blob Storage에서 BigQuery 테이블로 데이터를 로드할 수 있습니다. 전송된 데이터를 Google Cloud 리전에 있는 데이터와 조인하거나 BigQuery ML과 같은 BigQuery 기능을 활용할 수 있습니다.
다음 방법으로 데이터를 BigQuery로 전송할 수 있습니다.
LOAD DATA
문을 사용하여 Amazon S3 및 Azure Blob Storage의 파일에서 BigQuery 테이블로 데이터를 전송합니다.결과를 BigQuery 테이블로 전송하기 전에
CREATE TABLE AS SELECT
문을 사용하여 Amazon S3 또는 Blob Storage의 파일에서 데이터를 필터링합니다. 대상 테이블에 데이터를 추가하려면INSERT INTO SELECT
문을 사용합니다.데이터 조작은 Amazon S3 또는 Blob Storage의 데이터를 참조하는 외부 테이블에 적용됩니다.
할당량 및 한도
할당량 및 한도에 대한 자세한 내용은 쿼리 작업 할당량 및 한도를 참조하세요.
가격 책정
LOAD
문을 사용하여 클라우드 간에 전송된 바이트 수에 대한 요금이 청구됩니다. 가격 책정 정보는 BigQuery Omni 가격 책정의 Omni 교차 Cloud Data Transfer 섹션을 참조하세요.
CREATE TABLE AS SELECT
문 또는 INSERT INTO SELECT
문을 사용하여 클라우드 간에 전송된 바이트 수와 컴퓨팅 용량에 대한 요금이 청구됩니다.
LOAD
및 CREATE TABLE AS SELECT
문 모두 BigQuery Omni 리전의 슬롯에서 Amazon S3 및 Blob Storage 파일을 스캔하여 로드해야 합니다. 자세한 내용은 BigQuery Omni 가격 책정을 참조하세요.
시작하기 전에
다른 클라우드에 있는 파일에 대한 읽기 액세스 권한을 Google Cloud에 제공하려면 관리자에게 연결을 만들어 공유해 달라고 요청하세요. 연결을 만드는 방법은 Amazon S3 또는 Blob Storage에 연결을 참조하세요.
필요한 역할
교차 클라우드 전송을 사용하여 데이터를 로드하는 데 필요한 권한을 얻으려면 관리자에게 데이터 세트에 대한 BigQuery 데이터 편집자(roles/bigquery.dataEditor
) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
이 사전 정의된 역할에는 교차 클라우드 전송을 사용하여 데이터를 로드하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.
필수 권한
교차 클라우드 전송을 사용하여 데이터를 로드하려면 다음 권한이 필요합니다.
-
bigquery.tables.create
-
bigquery.tables.get
-
bigquery.tables.updateData
-
bigquery.tables.update
-
bigquery.jobs.create
-
bigquery.connections.use
커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.
BigQuery에서 IAM 역할에 대한 상세 설명은 사전 정의된 역할 및 권한을 참조하세요.
데이터 로드
LOAD DATA [INTO|OVERWRITE]
문을 사용하여 BigQuery에 데이터를 로드할 수 있습니다.
제한사항
LOAD DATA
작업은 예약에 따라 실행되지 않습니다. 작업에는 Google Cloud에서 관리되는 주문형 슬롯이 사용됩니다.- 연결 및 대상 데이터 세트는 동일한 프로젝트에 속해야 합니다. 프로젝트 간 데이터 로드는 지원되지 않습니다.
LOAD DATA
는 Amazon Simple Storage Service(Amazon S3) 또는 Azure Blob Storage에서 같은 위치에 배치된 BigQuery 리전으로 데이터를 전송할 때만 지원됩니다. 자세한 내용은 위치를 참조하세요.- 모든
US
리전에서US
멀티 리전으로 데이터를 전송할 수 있습니다. 또한 모든EU
리전에서EU
멀티 리전으로 전송할 수도 있습니다.
- 모든
예
예시 1
다음 예시에서는 스키마 자동 감지를 사용해 sample.parquet
라는 Parquet 파일을 Amazon S3 버킷에서 test_parquet
테이블로 로드합니다.
LOAD DATA INTO mydataset.testparquet FROM FILES ( uris = ['s3://test-bucket/sample.parquet'], format = 'PARQUET' ) WITH CONNECTION `aws-us-east-1.test-connection`
예시 2
다음 예시에서는 Blob Storage에서 시간별로 파티션을 나눈 사전 정의된 열이 있는 test_csv
테이블로 sampled*
프리픽스가 있는 CSV 파일을 로드합니다.
LOAD DATA INTO mydataset.test_csv (Number INT64, Name STRING, Time DATE) PARTITION BY Time FROM FILES ( format = 'CSV', uris = ['azure://test.blob.core.windows.net/container/sampled*'], skip_leading_rows=1 ) WITH CONNECTION `azure-eastus2.test-connection`
예시 3
다음 예시에서는 스키마 자동 감지를 사용해 기존 테이블 test_parquet
를 sample.parquet
라는 파일의 데이터로 덮어씁니다.
LOAD DATA OVERWRITE mydataset.testparquet FROM FILES ( uris = ['s3://test-bucket/sample.parquet'], format = 'PARQUET' ) WITH CONNECTION `aws-us-east-1.test-connection`
데이터 필터링
CREATE TABLE AS SELECT
문과 INSERT INTO SELECT
문을 사용하여 데이터를 BigQuery로 전송하기 전에 필터링할 수 있습니다.
제한사항
SELECT
쿼리 결과가 논리 바이트로 60GiB를 초과하면 쿼리가 실패합니다. 테이블이 생성되지 않으며 데이터가 전송되지 않습니다. 스캔되는 데이터의 크기를 줄이는 방법은 쿼리에서 처리되는 데이터 줄이기를 참조하세요.임시 테이블은 지원되지 않습니다.
WKB(Well-Known Binary) 지리정보 데이터 형식 전송은 지원되지 않습니다.
INSERT INTO SELECT
문은 클러스터링된 테이블로의 데이터 전송을 지원하지 않습니다.INSERT INTO SELECT
문에서 대상 테이블이SELECT
쿼리의 소스 테이블과 동일한 경우INSERT INTO SELECT
문은 대상 테이블의 행을 수정하지 않습니다. BigQuery가 리전 간에 데이터를 읽을 수 없으므로 대상 테이블이 수정되지 않습니다.CREATE TABLE AS SELECT
및INSERT INTO SELECT
는 Amazon S3 또는 Blob Storage에서 같은 위치에 배치된 BigQuery 리전으로 데이터를 전송할 때만 지원됩니다. 자세한 내용은 위치를 참조하세요.- 모든
US
리전에서US
멀티 리전으로 데이터를 전송할 수 있습니다. 또한 모든EU
리전에서EU
멀티 리전으로 전송할 수도 있습니다.
- 모든
예
예시 1
Amazon S3의 데이터를 참조하는 myawsdataset.orders
라는 BigLake 테이블이 있다고 가정해 보겠습니다.
해당 테이블의 데이터를 US 멀티 리전의 BigQuery 테이블 myotherdataset.shipments
로 전송하려고 합니다.
먼저 myawsdataset.orders
테이블에 대한 정보를 표시합니다.
bq show myawsdataset.orders;
출력은 다음과 비슷합니다.
Last modified Schema Type Total URIs Expiration ----------------- -------------------------- ---------- ------------ ----------- 31 Oct 17:40:28 |- l_orderkey: integer EXTERNAL 1 |- l_partkey: integer |- l_suppkey: integer |- l_linenumber: integer |- l_returnflag: string |- l_linestatus: string |- l_commitdate: date
다음으로 myotherdataset.shipments
테이블에 대한 정보를 표시합니다.
bq show myotherdataset.shipments
출력은 다음과 비슷합니다. 출력을 간소화하기 위해 일부 열을 생략합니다.
Last modified Schema Total Rows Total Bytes Expiration Time Partitioning Clustered Fields Total Logical ----------------- --------------------------- ------------ ------------- ------------ ------------------- ------------------ --------------- 31 Oct 17:34:31 |- l_orderkey: integer 3086653 210767042 210767042 |- l_partkey: integer |- l_suppkey: integer |- l_commitdate: date |- l_shipdate: date |- l_receiptdate: date |- l_shipinstruct: string |- l_shipmode: string
이제 CREATE TABLE AS SELECT
문을 사용하여 미국 멀티 리전의 myotherdataset.orders
테이블에 데이터를 선택적으로 로드할 수 있습니다.
CREATE OR REPLACE TABLE myotherdataset.orders PARTITION BY DATE_TRUNC(l_commitdate, YEAR) AS SELECT * FROM myawsdataset.orders WHERE EXTRACT(YEAR FROM l_commitdate) = 1992;
그런 다음 새로 만든 테이블을 사용하여 조인 작업을 수행할 수 있습니다.
SELECT orders.l_orderkey, orders.l_orderkey, orders.l_suppkey, orders.l_commitdate, orders.l_returnflag, shipments.l_shipmode, shipments.l_shipinstruct FROM myotherdataset.shipments JOIN `myotherdataset.orders` as orders ON orders.l_orderkey = shipments.l_orderkey AND orders.l_partkey = shipments.l_partkey AND orders.l_suppkey = shipments.l_suppkey WHERE orders.l_returnflag = 'R'; -- 'R' means refunded.
새 데이터를 사용할 수 있으면 INSERT INTO SELECT
문을 사용하여 1993년의 데이터를 대상 테이블에 추가합니다.
INSERT INTO myotherdataset.orders SELECT * FROM myawsdataset.orders WHERE EXTRACT(YEAR FROM l_commitdate) = 1993;
예시 2
다음 예시에서는 수집 시간으로 파티션을 나눈 테이블에 데이터를 삽입합니다.
CREATE TABLE mydataset.orders(id String, numeric_id INT) PARTITION BY _PARTITIONDATE;
파티션을 나눈 테이블을 만든 후 수집 시간으로 파티션을 나눈 테이블에 데이터를 삽입할 수 있습니다.
INSERT INTO mydataset.orders( _PARTITIONTIME, id, numeric_id) SELECT TIMESTAMP("2023-01-01"), id, numeric_id, FROM mydataset.ordersof23 WHERE numeric_id > 4000000;
권장사항
- 크기가 5MB 미만인 여러 개의 파일을 로드하지 마세요. 대신 파일에 대한 외부 테이블을 만들어 쿼리 결과를 Amazon S3 또는 Blob Storage로 내보내 더 큰 테이블을 만듭니다. 이 방법을 사용하면 데이터 전송 시간이 향상됩니다. 최대 쿼리 결과 한도에 대한 자세한 내용은 BigQuery Omni 최대 쿼리 결과 크기를 참조하세요.
- 소스 데이터가 gzip으로 압축된 파일에 있는 경우 외부 테이블을 만드는 동안
external_table_options.compression
옵션을GZIP
으로 설정합니다.
다음 단계
- BigQuery ML 알아보기
- BigQuery Omni 알아보기
- 쿼리 실행 방법 알아보기
- BigQuery Omni의 VPC 서비스 제어 설정 방법 알아보기
- Amazon S3에서 BigQuery로 및 Blob Storage에서 BigQuery로의 반복 로드 작업을 예약하고 관리하는 방법 알아보기