교차 클라우드 운영으로 데이터 로드

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을 사용하여 클라우드 간에 전송된 바이트 수에 대한 요금이 청구됩니다. 가격 정보는 데이터 전송 가격 책정을 참조하세요.

CREATE TABLE AS SELECT(미리보기) 또는 INSERT INTO SELECT(미리보기)을 사용하여 전송된 바이트에는 요금이 청구되지 않습니다. 그러나 컴퓨팅 용량에 대한 요금은 청구됩니다.

LOADCREATE TABLE AS SELECT 문 모두 BigQuery Omni 리전의 슬롯에서 Amazon S3 및 Blob Storage 파일을 스캔하여 로드해야 합니다.

시작하기 전에

다른 클라우드에 있는 파일에 대한 읽기 액세스 권한을 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에서 관리되는 주문형 슬롯이 사용됩니다.
  • 연결 및 대상 데이터 세트는 동일한 프로젝트에 속해야 합니다. 프로젝트 간 데이터 로드는 지원되지 않습니다.

예시

예시 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_parquetsample.parquet라는 파일의 데이터로 덮어씁니다.

LOAD DATA OVERWRITE mydataset.testparquet
  FROM FILES (
    uris = ['s3://test-bucket/sample.parquet'],
    format = 'PARQUET'
  )
  WITH CONNECTION `aws-us-east-1.test-connection`

데이터 필터링

BigQuery로 전송하기 전 CREATE TABLE AS SELECTINSERT INTO SELECT을 사용하여 데이터를 필터링할 수 있습니다.

제한사항

  • CREATE TABLECREATE TABLE IF NOT EXISTS 문은 지원되지 않지만 CREATE OR REPLACE TABLE 문은 지원됩니다.

  • SELECT 쿼리 결과가 논리 바이트로 20GiB를 초과하면 쿼리가 실패합니다. 테이블이 생성되지 않으며 데이터가 전송되지 않습니다. 스캔되는 데이터의 크기를 줄이는 방법은 쿼리에서 처리되는 데이터 줄이기를 참조하세요.

  • 임시 테이블은 지원되지 않습니다.

  • WKB(Well-Known Binary) 지리정보 데이터 형식 전송은 지원되지 않습니다.

  • INSERT INTO SELECT 문은 클러스터링된 테이블로의 데이터 전송을 지원하지 않습니다.

  • INSERT INTO SELECT 문에서 대상 테이블이 SELECT 쿼리의 소스 테이블과 동일한 경우 INSERT INTO SELECT 문은 대상 테이블의 행을 수정하지 않습니다. BigQuery가 리전 간에 데이터를 읽을 수 없으므로 대상 테이블은 수정되지 않습니다.

예시

예시 1

Amazon S3의 데이터를 참조하는 myawsdataset.orders라는 BigLake 테이블이 있다고 가정해 보겠습니다. 해당 테이블의 데이터를 US 멀티 리전의 BigQuery 테이블 myotherdataset.shipments로 전송하려고 합니다.

먼저 myawsdataset.orders 테이블에 대한 정보를 표시합니다.

SELECT
  table_name, ddl
FROM
  `myproject`.myawsdataset.INFORMATION_SCHEMA.TABLES
WHERE
  table_name = '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 테이블에 대한 정보를 표시합니다.

SELECT
  table_name, ddl
FROM
  `myproject`.myotherdataset.INFORMATION_SCHEMA.TABLES
WHERE
  table_name = '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 문을 사용하여 US 멀티 리전의 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으로 설정합니다.

다음 단계