쿼리 결과를 Amazon S3로 내보내기

BigQuery Omni를 사용하면 쿼리 결과를 Amazon S3로 직접 내보낼 수 있습니다.

시작하기 전에

올바른 Amazon Web Services(AWS) ID 및 액세스 관리(IAM) 정책이 있는지 확인합니다.

쿼리 실행

쿼리를 실행하려면 Google Cloud Console 또는 bq 명령줄 도구를 사용합니다.

Google Cloud Console

  1. Google Cloud Console에서 BigQuery 페이지를 엽니다.

    BigQuery 페이지로 이동

  2. 쿼리 편집기 필드에 표준 SQL 내보내기 쿼리를 입력합니다. 표준 SQL은 Google Cloud Console의 기본 구문입니다.

    EXPORT DATA WITH CONNECTION `CONNECTION_REGION.CONNECTION_NAME` \
    OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...) \
    AS QUERY
    

    다음을 바꿉니다.

    • CONNECTION_REGION: 연결이 생성된 리전입니다.
    • CONNECTION_NAME: S3 버킷에 쓰는 데 필요한 권한으로 만든 연결 이름입니다.
    • BUCKET_NAME: 데이터를 쓰기 위해 만든 Amazon S3 버킷입니다.
    • PATH: 내보낸 파일을 쓰려는 경로입니다. 경로 문자열의 리프 디렉터리에는 정확히 하나의 와일드 카드(*)가 포함되어야 합니다(예: ../aa/*, ../aa/b*c, ../aa/*bc, ../aa/bc*). BigQuery는 내보낸 파일 수에 따라 *0000..N으로 바꿉니다. BigQuery에서 파일 수와 크기를 결정합니다. BigQuery에서 파일 2개를 내보내기로 한 경우 첫 번째 파일의 파일 이름에서 *000000000000으로 바뀌고, * 두 번째 파일의 파일 이름이 000000000001로 바뀝니다.
    • FORMAT: 지원되는 형식은 JSON, AVRO, CSV입니다.
    • QUERY: 데이터 분석을 위해 실행할 쿼리입니다.

    예를 들어 다음 쿼리는 쿼리 결과를 BigQuery에서 S3의 s3://bq-omni-bucket/exported/000000000000로 내보냅니다.

    EXPORT DATA WITH CONNECTION `aws-us-east-1.s3-write-conn` OPTIONS(uri="s3://bq-omni-bucket/exported/*", format="CSV") AS SELECT * FROM s3dataset.s3table
    
  3. 실행을 클릭합니다.

bq

query 명령어를 사용하고 --nouse_legacy_sql 또는 --use_legacy_sql=false 플래그를 사용하여 표준 SQL 구문을 지정합니다.

내보내기 쿼리를 실행하려면 다음을 입력합니다.

bq query --nouse_legacy_sql \
EXPORT DATA WITH CONNECTION CONNECTION_REGION.CONNECTION_NAME \
OPTIONS(uri="s3://BUCKET_NAME/PATH", format="FORMAT", ...) \
AS QUERY

다음을 바꿉니다.

  • CONNECTION_REGION: 연결이 생성된 리전입니다.
  • CONNECTION_NAME: S3 버킷에 쓰는 데 필요한 권한으로 만든 연결 이름입니다.
  • BUCKET_NAME: 데이터를 쓰기 위해 만든 Amazon S3 버킷입니다.
  • PATH: 내보낸 파일을 쓰려는 경로입니다. 경로 문자열의 리프 디렉터리에는 정확히 하나의 와일드 카드(*)가 포함되어야 합니다(예: ../aa/*, ../aa/b*c, ../aa/*bc, ../aa/bc*). BigQuery는 내보낸 파일 수에 따라 *0000..N으로 바꿉니다. BigQuery에서 파일 수와 크기를 결정합니다. BigQuery에서 파일 2개를 내보내는 경우 첫 번째 파일의 파일 이름에서 *000000000000으로 바뀌고, * 두 번째 파일의 파일 이름이 000000000001로 바뀝니다.
  • FORMAT: 지원되는 형식은 JSON, AVRO, CSV입니다.
  • QUERY: 데이터 분석을 위해 실행할 쿼리입니다.

자바

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;

// Sample to export query results to Amazon S3 bucket
public class ExportQueryResultsToS3 {

  public static void main(String[] args) throws InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String datasetName = "MY_DATASET_NAME";
    String externalTableName = "MY_EXTERNAL_TABLE_NAME";
    // connectionName should be in the format of connection_region.connection_name. e.g.
    // aws-us-east-1.s3-write-conn
    String connectionName = "MY_CONNECTION_REGION.MY_CONNECTION_NAME";
    // destinationUri must contain exactly one * anywhere in the leaf directory of the path string
    // e.g. ../aa/*, ../aa/b*c, ../aa/*bc, and ../aa/bc*
    // BigQuery replaces * with 0000..N depending on the number of files exported.
    // BigQuery determines the file count and sizes.
    String destinationUri = "s3://your-bucket-name/*";
    String format = "EXPORT_FORMAT";
    // Export result of query to find states starting with 'W'
    String query =
        String.format(
            "EXPORT DATA WITH CONNECTION `%s` OPTIONS(uri='%s', format='%s') "
              + "AS SELECT * FROM %s.%s.%s WHERE name LIKE 'W%%'",
            connectionName, destinationUri, format, projectId, datasetName, externalTableName);
    exportQueryResultsToS3(query);
  }

  public static void exportQueryResultsToS3(String query) throws InterruptedException {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableResult results = bigquery.query(QueryJobConfiguration.of(query));

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query results exported to Amazon S3 successfully.");
    } catch (BigQueryException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

다음 단계