쿼리 결과 쓰기

이 문서에서는 쿼리 결과를 기록하거나 저장하는 방법을 설명합니다.

임시 테이블과 영구 테이블

BigQuery는 모든 쿼리 결과를 테이블에 저장하며, 테이블은 영구적이거나 임시적일 수 있습니다.

  • 임시 테이블은 무작위로 이름이 지정되는 테이블이며 특수한 데이터세트에 저장됩니다. 임시 테이블은 쿼리 결과를 캐시 처리하는 데 사용됩니다. 임시 테이블의 수명은 약 24시간입니다. 임시 테이블을 공유에 사용할 수 없으며, 표준 목록이나 그 밖의 테이블 조작 방법을 사용하여 볼 수 없습니다. 임시 테이블 저장에는 비용이 청구되지 않습니다.

  • 영구 테이블은 사용자가 액세스할 수 있는 데이터세트에 있는 새 테이블 또는 기존 테이블일 수 있습니다. 쿼리 결과를 새 테이블에 쓰는 경우, 데이터 저장에 대한 비용이 청구됩니다. 쿼리 결과를 영구 테이블에 쓰는 경우, 쿼리하는 테이블이 대상 테이블이 포함된 데이터세트와 같은 위치에 있어야 합니다.

영구 테이블에 쿼리 결과 쓰기

쿼리 결과를 영구 테이블에 쓰는 경우, 새 테이블을 만들거나 결과를 기존 테이블에 추가하거나 기존 테이블을 덮어쓸 수 있습니다. 다음을 통해 쿼리 결과를 영구 테이블에 쓸 수 있습니다.

  • GCP Console 또는 기본 BigQuery 웹 UI 사용
  • 명령줄 도구의 bq query 명령어 사용
  • jobs.insert API 메소드 호출 및 query 작업 구성

필수 권한

쿼리 결과를 영구 테이블에 쓰는 데 필요한 권한은 데이터의 쓰기 처리에 따라 달라집니다.

새 테이블에 쿼리 결과를 쓰기 위한 권한

새 테이블에 쿼리 결과를 쓰려면 데이터세트 수준의 WRITER 액세스 권한이 있거나 bigquery.tables.create 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 다음의 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.tables.create 권한이 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있기 때문에 bigquery.user 역할에 할당된 사용자는 자신이 생성한 모든 데이터세트에서 테이블을 생성할 수 있습니다. bigquery.user 역할에 할당된 사용자가 데이터세트를 만들면 해당 사용자는 데이터세트에 대한 OWNER 액세스 권한을 얻습니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 데이터세트와 데이터세트의 모든 테이블을 완벽하게 제어할 수 있습니다.

BigQuery에서 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

데이터를 덮어쓰거나 추가하기 위한 권한

쿼리 결과를 사용하여 기존 테이블을 덮어쓰거나 기존 테이블에 데이터를 추가하려면 데이터세트 수준의 WRITER 액세스 권한이 있거나 bigquery.tables.updateData 권한을 포함하는 프로젝트 수준 IAM 역할을 할당받아야 합니다. 다음의 사전 정의된 프로젝트 수준 IAM 역할에는 bigquery.tables.updateData 권한이 있습니다.

또한 bigquery.user 역할에는 bigquery.datasets.create 권한이 있기 때문에 bigquery.user 역할에 할당된 사용자는 자신이 데이터세트에서 생성한 모든 테이블의 데이터를 덮어쓰거나 추가할 수 있습니다. bigquery.user 역할에 할당된 사용자가 데이터세트를 만들면 해당 사용자는 데이터세트에 대한 OWNER 액세스 권한을 얻습니다. 데이터세트에 대한 OWNER 액세스 권한이 있는 사용자는 데이터세트와 데이터세트의 모든 테이블을 완벽하게 제어할 수 있습니다.

BigQuery에서 IAM 역할 및 권한에 대한 자세한 내용은 액세스 제어를 참조하세요. 데이터세트 수준 역할에 대한 자세한 내용은 데이터세트 기본 역할을 참조하세요.

쿼리 결과 쓰기

영구 테이블에 쿼리 결과를 쓰려면 다음 내용을 따르세요.

기본 UI

  1. 기본 BigQuery 웹 UI로 이동합니다.
    기본 BigQuery 웹 UI로 이동

  2. 쿼리 작성 버튼을 클릭합니다.

  3. 새 쿼리 텍스트 영역에 유효한 SQL 쿼리를 입력합니다.

  4. 옵션 표시를 클릭합니다.

  5. 대상 테이블 섹션에서 테이블 선택을 클릭합니다.

  6. 대상 테이블 선택 대화상자에서 다음을 수행합니다.

    1. 프로젝트에서 대상 테이블을 만들 프로젝트를 선택합니다.

    2. 데이터세트에서 테이블을 저장할 데이터세트를 선택합니다.

    3. 테이블 ID 필드에 테이블 이름을 입력합니다. 이름은 대상 데이터세트 내에서 고유해야 합니다. 테이블 이름은 최대 1,024자까지 허용되며, a-z, A-Z, 0-9 또는 _(밑줄 문자)만 포함할 수 있습니다.

    4. 확인을 클릭합니다.

  7. 대상 테이블 섹션의 쓰기 환경설정에서 다음 중 하나를 선택합니다.

    • 비어 있으면 쓰기 — 테이블이 비어 있는 경우에만 쿼리 결과를 테이블에 씁니다.
    • 테이블에 추가 — 쿼리 결과를 기존 테이블에 추가합니다.
    • 테이블 덮어쓰기 — 쿼리 결과를 사용하여 기존 테이블을 같은 이름으로 덮어씁니다.
  8. (선택사항) 처리 위치에서 미지정을 클릭하고 데이터의 위치를 선택합니다.

  9. 쿼리 실행을 클릭합니다. 그러면 지정한 테이블에 쿼리 결과를 쓰는 쿼리 작업이 생성됩니다.

또는 쿼리를 실행하기 전에 대상 테이블을 지정하지 않은 경우에는 결과 창에서 테이블로 저장 버튼을 클릭하여 임시 테이블을 영구 테이블에 복사할 수 있습니다.

CLI

bq query 명령어를 입력하고 --destination_table 플래그를 지정해 쿼리 결과에 기반한 영구 테이블을 만듭니다. 표준 SQL 구문을 사용하려면 use_legacy_sql=false 플래그를 지정하세요. 기본 프로젝트에 없는 테이블에 쿼리 결과를 쓰려면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다.

--location 플래그를 제공하고 값을 사용자 위치로 설정합니다.

기존 대상 테이블의 쓰기 처리를 제어하려면 다음 선택적 플래그 중 하나를 지정합니다.

  • --append_table — 대상 테이블이 있는 경우, 쿼리 결과가 테이블에 추가됩니다.
  • --replace — 대상 테이블이 있는 경우, 쿼리 결과로 테이블을 덮어씁니다.

    bq --location=[LOCATION] query --destination_table [PROJECT_ID]:[DATASET].[TABLE] --use_legacy_sql=false '[QUERY]'
    

각 항목의 의미는 다음과 같습니다.

  • [LOCATION]은 쿼리 처리에 사용되는 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어, 도쿄 지역에서 BigQuery를 사용하는 경우에는 플래그 값을 asia-northeast1로 설정할 수 있습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 쿼리 결과를 쓰는 테이블이 포함된 데이터세트 이름입니다.
  • [TABLE]은 쿼리 결과를 쓰는 테이블의 이름입니다.
  • [QUERY]는 표준 SQL 구문의 쿼리입니다.

쓰기 처리 플래그를 지정하지 않으면 비어 있는 경우에만 테이블에 결과를 쓰는 것이 기본 동작입니다. 테이블이 존재하고 비어 있지 않으면 다음 오류가 반환됩니다. BigQuery error in query operation: Error processing job '[PROJECT_ID]:bqjob_123abc456789_00000e1234f_1': Already Exists: Table [PROJECT_ID]:[DATASET].[TABLE].

예:

다음 명령어를 사용하여 mydataset에 있는 mytable이라는 이름의 대상 테이블에 쿼리 결과를 씁니다. 데이터세트는 기본 프로젝트에 있습니다. 명령어에서 쓰기 처리 플래그가 지정되지 않았으므로 테이블은 새 테이블이거나 비어 있어야 합니다. 그렇지 않을 경우, Already exists 오류가 반환됩니다. 쿼리는 USA Name Data 공개 데이터세트에서 데이터를 검색합니다.

bq --location=US query --destination_table mydataset.mytable --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

쿼리 결과를 사용하여 mydataset에 있는 mytable이라는 이름의 대상 테이블을 덮어쓰려면 다음 명령어를 입력합니다. 데이터세트는 기본 프로젝트에 있습니다. 명령어는 --replace 플래그를 사용하여 대상 테이블을 덮어씁니다.

bq --location=US query --destination_table mydataset.mytable --replace --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

mydataset에 있는 mytable이라는 이름의 대상 테이블에 쿼리 결과를 추가하려면 다음 명령어를 입력합니다. 데이터세트는 기본 프로젝트가 아닌 myotherproject에 있습니다. 명령어는 --append 플래그를 사용하여 쿼리 결과를 대상 테이블에 추가합니다.

bq --location=US query --destination_table myotherproject:mydataset.mytable --append --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

API

쿼리 결과를 영구 테이블에 저장하려면 jobs.insert 메소드를 호출하고, query 작업을 구성하고, configuration.query.destinationTable 속성 값을 포함시킵니다. 기존 대상 테이블의 쓰기 처리를 제어하려면 configuration.query.writeDisposition 속성을 구성합니다.

작업 리소스jobReference 섹션에 있는 location 속성에 위치를 지정합니다.

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

쿼리 결과를 영구 테이블에 저장하려면 QueryJobConfiguration에서 대상 테이블을 원하는 TableId로 설정합니다.

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // Note that setUseLegacySql is set to false by default
    QueryJobConfiguration.newBuilder(query)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

쿼리 결과를 영구 테이블에 저장하려면 QueryJobConfig를 만들고 대상을 원하는 TableReference로 설정합니다. 작업 구성을 쿼리 메소드에 전달합니다.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

크기가 큰 쿼리 결과 쓰기

일반적으로 쿼리에는 최대 응답 크기가 있습니다. 이보다 크기가 큰 결과가 반환될 수 있는 쿼리를 실행하려고 하는 경우, 다음과 같이 하면 됩니다.

  • 표준 SQL에서 쿼리 결과의 대상 테이블을 지정합니다.
  • 이전 SQL에서 대상 테이블을 지정하고 allowLargeResults 옵션을 설정합니다.

크기가 큰 쿼리 결과를 위한 대상 테이블을 지정하면 데이터 저장에 대한 비용이 청구됩니다.

제한사항

이전 SQL에서는 크기가 큰 결과 쓰기에 다음과 같은 제한이 있습니다.

  • 대상 테이블을 지정해야 합니다.
  • 최상위 ORDER BY, TOP 또는 LIMIT 절은 지정할 수 없습니다. 지정하면 쿼리 출력을 더 이상 병렬로 계산할 수 없으므로, allowLargeResults를 사용하는 이점이 없어집니다.
  • 윈도우 함수PARTITION BY 절과 함께 사용하는 경우에만 크기가 큰 쿼리 결과를 반환할 수 있습니다.

이전 SQL을 사용하여 크기가 큰 결과 쓰기

이전 SQL을 사용하여 크기가 큰 결과 세트를 쓰려면 다음 내용을 따르세요.

기본 UI

  1. BigQuery 웹 UI로 이동합니다.
    BigQuery 웹 UI로 이동

  2. Compose query(쿼리 작성) 버튼을 클릭합니다.

  3. 새 쿼리 텍스트 영역에 유효한 BigQuery SQL 쿼리를 입력합니다. #legacySQL 프리픽스를 사용하거나 쿼리 옵션에서 이전 SQL 사용이 선택되어 있어야 합니다.

  4. 옵션 표시를 클릭합니다.

  5. Destination Table에서 Select Table을 클릭합니다.

  6. 대상 테이블 선택 대화상자에서 다음을 수행합니다.

    1. 프로젝트에서 대상 테이블을 만들 프로젝트를 선택합니다.

    2. 데이터세트에서 테이블을 저장할 데이터세트를 선택합니다.

    3. Table ID 필드에 테이블 이름을 입력합니다.

    4. 확인을 클릭합니다.

  7. 크기가 큰 결과 세트를 기존 테이블에 쓰는 경우, 쓰기 환경설정 옵션을 사용하여 대상 테이블의 쓰기 처리를 제어할 수 있습니다.

    • 비어 있으면 쓰기 — 테이블이 비어 있는 경우에만 쿼리 결과를 테이블에 씁니다.
    • 테이블에 추가 — 쿼리 결과를 기존 테이블에 추가합니다.
    • 테이블 덮어쓰기 — 쿼리 결과를 사용하여 기존 테이블을 같은 이름으로 덮어씁니다.
  8. 결과 크기에서 크기가 큰 결과 허용을 선택합니다.

    크기가 큰 결과 허용 옵션

  9. (선택사항) 처리 위치에서 미지정을 클릭하고 데이터의 위치를 선택합니다.

  10. 쿼리 실행을 클릭합니다. 그러면 지정한 테이블에 크기가 큰 결과 세트를 쓰는 쿼리 작업이 생성됩니다.

명령줄

--destination_table 플래그와 함께 --allow_large_results 플래그를 사용하여 크기가 큰 결과 세트를 보관할 대상 테이블을 만듭니다. --allow_large_results 옵션은 이전 SQL에만 적용되므로 --use_legacy_sql=true 플래그도 지정해야 합니다. 기본 프로젝트에 없는 테이블에 쿼리 결과를 쓰려면 프로젝트 ID를 [PROJECT_ID]:[DATASET] 형식으로 데이터세트 이름에 추가합니다. --location 플래그를 제공하고 값을 사용자 위치로 설정합니다.

기존 대상 테이블의 쓰기 처리를 제어하려면 다음 선택적 플래그 중 하나를 지정합니다.

  • --append_table — 대상 테이블이 있는 경우, 쿼리 결과가 테이블에 추가됩니다.
  • --replace — 대상 테이블이 있는 경우, 쿼리 결과로 테이블을 덮어씁니다.

    bq --location=[LOCATION] query --destination_table [PROJECT_ID]:[DATASET].[TABLE_NAME] --use_legacy_sql=true --allow_large_results "[QUERY]"
    

각 항목의 의미는 다음과 같습니다.

  • [LOCATION]은 쿼리 처리에 사용되는 위치의 이름입니다. --location 플래그는 선택사항입니다. 예를 들어, 도쿄 지역에서 BigQuery를 사용하는 경우에는 플래그 값을 asia-northeast1로 설정할 수 있습니다. .bigqueryrc 파일을 사용하여 위치 기본값을 설정할 수 있습니다.
  • [PROJECT_ID]는 프로젝트 ID입니다.
  • [DATASET]는 쿼리 결과를 쓰는 테이블이 포함된 데이터세트 이름입니다.
  • [TABLE]은 쿼리 결과를 쓰는 테이블의 이름입니다.
  • [QUERY]는 이전 SQL 구문의 쿼리입니다.

예:

다음 명령어를 입력하여 mydataset에 있는 mytable이라는 이름의 대상 테이블에 크기가 큰 쿼리 결과를 씁니다. 데이터세트는 기본 프로젝트에 있습니다. 명령어에서 쓰기 처리 플래그가 지정되지 않았으므로 테이블은 새 테이블이거나 비어 있어야 합니다. 그렇지 않을 경우, Already exists 오류가 반환됩니다. 쿼리는 USA Name Data 공개 데이터세트에서 데이터를 검색합니다. 이 쿼리는 예시 목적으로만 사용됩니다. 반환되는 결과 세트는 최대 응답 크기를 초과하지 않습니다.

bq --location=US query --destination_table mydataset.mytable --use_legacy_sql=true --allow_large_results "SELECT name,number FROM [bigquery-public-data:usa_names.usa_1910_current] WHERE gender = 'M' ORDER BY number DESC"

크기가 큰 쿼리 결과를 사용하여 mydataset에 있는 mytable이라는 이름의 대상 테이블을 덮어쓰려면 다음 명령어를 입력합니다. 데이터세트는 기본 프로젝트가 아니라 myotherproject에 있습니다. 명령어는 --replace 플래그를 사용하여 대상 테이블을 덮어씁니다.

bq --location=US query --destination_table mydataset.mytable --replace --use_legacy_sql=true --allow_large_results "SELECT name,number FROM [bigquery-public-data:usa_names.usa_1910_current] WHERE gender = 'M' ORDER BY number DESC"

mydataset에 있는 mytable이라는 이름의 대상 테이블에 크기가 큰 쿼리 결과를 추가하려면 다음 명령어를 입력합니다. 데이터세트는 기본 프로젝트가 아니라 myotherproject에 있습니다. 명령어는 --append 플래그를 사용하여 쿼리 결과를 대상 테이블에 추가합니다.

bq --location=US query --destination_table myotherproject:mydataset.mytable --append --use_legacy_sql=true --allow_large_results "SELECT name,number FROM [bigquery-public-data:usa_names.usa_1910_current] WHERE gender = 'M' ORDER BY number DESC"

API

크기가 큰 결과를 대상 테이블에 쓰려면 jobs.insert 메소드를 호출하고 query 작업을 구성한 후 configuration.query.allowLargeResults 속성을 true로 설정합니다. configuration.query.destinationTable 속성을 사용하여 대상 테이블을 지정합니다. 기존 대상 테이블의 쓰기 처리를 제어하려면 configuration.query.writeDisposition 속성을 구성합니다.

작업 리소스jobReference 섹션에 있는 location 속성에 위치를 지정합니다.

Go

이 샘플을 시도하기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

q := client.Query(
	"SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;")
q.UseLegacySQL = true
q.AllowLargeResults = true
q.QueryConfig.Dst = client.Dataset(dstDatasetID).Table(dstTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

자바

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 자바 설정 안내를 따르세요. 자세한 내용은 BigQuery 자바 API 참조 문서를 확인하세요.

크기가 큰 결과를 사용 설정하려면 크기가 큰 결과 허용true로 설정하고 QueryJobConfiguration에서 대상 테이블을 원하는 TableId로 설정합니다.

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // To use legacy SQL syntax, set useLegacySql to true.
    QueryJobConfiguration.newBuilder(query)
        .setUseLegacySql(true)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        // Allow results larger than the maximum response size.
        // If true, a destination table must be set.
        .setAllowLargeResults(true)
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

이 샘플을 시도해 보기 전에 클라이언트 라이브러리를 사용하는 BigQuery 빠른 시작의 Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set use_legacy_sql to True to use legacy SQL syntax.
job_config.use_legacy_sql = True
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
job_config.allow_large_results = True
sql = """
    SELECT corpus
    FROM [bigquery-public-data:samples.shakespeare]
    GROUP BY corpus;
"""
# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

쿼리 결과 다운로드 및 저장

SQL 쿼리 실행 후 결과를 로컬 머신의 파일에 다운로드하거나 Google 스프레드시트에 결과를 저장하거나 BigQuery의 영구 테이블에 결과를 저장할 수 있습니다.

제한사항

쿼리 결과 다운로드 및 저장에는 다음 제한사항이 적용됩니다.

  • 쿼리 결과는 로컬 파일로만 다운로드할 수 있습니다.
  • 기본 BigQuery 웹 UI를 사용하여 쿼리 결과를 다운로드하려면 결과 세트의 행 수가 16,000개보다 적고 크기가 10MB 이하여야 합니다. 크기가 10MB보다 크거나 행 수가 16,000개를 넘는 결과를 테이블에 저장할 수 있습니다.
  • 쿼리 결과를 CSV 또는 줄바꿈으로 구분된 JSON 형식으로만 다운로드할 수 있습니다.
  • CSV 형식의 중첩되고 반복되는 데이터가 포함된 쿼리 결과를 다운로드할 수 없습니다.
  • 중첩되고 반복되는 데이터가 포함된 쿼리 결과를 Google 스프레드시트에 저장할 수 없습니다.
  • 기본 BigQuery 웹 UI를 사용하여 쿼리 결과를 Google 스프레드시트에 저장하는 경우에는 결과 세트의 행 수가 16,000개보다 적고 크기가 10MB 이하여야 합니다. 크기가 10MB보다 크거나 행 수가 16,000개를 넘는 결과를 대신 테이블에 저장할 수 있습니다.
  • 결과를 Google 스프레드시트에 저장하는 기능은 명령줄 도구나 API에서 지원되지 않습니다.

쿼리 결과 다운로드

쿼리 결과를 CSV 또는 줄바꿈으로 구분된 JSON 파일로 다운로드하려면 다음 안내를 따릅니다.

기본 UI

  1. BigQuery 웹 UI로 이동합니다.
    BigQuery 웹 UI로 이동

  2. 쿼리 작성 버튼을 클릭합니다.

  3. 새 쿼리 텍스트 영역에 유효한 SQL 쿼리를 입력합니다.

  4. 옵션 표시를 클릭합니다.

  5. (선택사항) 처리 위치에서 미지정을 클릭하고 데이터의 위치를 선택합니다.

  6. 쿼리 실행을 클릭합니다.

  7. 결과가 반환되면 쿼리 결과 위에 있는 CSV로 다운로드 또는 JSON으로 다운로드 버튼을 클릭합니다.

    다운로드 및 저장 버튼 스크린샷

    브라우저의 기본 다운로드 위치로 파일이 다운로드됩니다.

쿼리 결과를 테이블에 저장

쿼리 결과를 테이블로 저장하려면 다음 안내를 따릅니다.

기본 UI

  1. BigQuery 웹 UI로 이동합니다.
    BigQuery 웹 UI로 이동

  2. 쿼리 작성 버튼을 클릭합니다.

  3. 새 쿼리 텍스트 영역에 유효한 SQL 쿼리를 입력합니다.

  4. 옵션 표시를 클릭합니다.

  5. (선택사항) 처리 위치에서 미지정을 클릭하고 데이터의 위치를 선택합니다.

  6. 쿼리 실행을 클릭합니다.

  7. 결과가 반환되면 쿼리 결과 위에 있는 테이블로 저장 버튼을 클릭합니다.

    다운로드 및 저장 버튼 스크린샷

  8. 테이블 복사 대화상자에서 다음을 수행합니다.

    • 대상 프로젝트에서 쿼리 결과를 저장할 프로젝트를 선택합니다.
    • 대상 데이터세트에서 쿼리 결과를 저장할 데이터세트를 선택합니다. 소스 데이터세트와 대상 데이터세트는 같은 위치에 있어야 합니다.
    • 대상 테이블에 새 테이블 이름을 입력합니다. 이름은 대상 데이터세트 내에서 고유해야 합니다. 테이블 이름은 최대 1,024자까지 허용되며, a-z, A-Z, 0-9 또는 _(밑줄 문자)만 포함할 수 있습니다. 기본 BigQuery 웹 UI를 사용하여 대상 데이터세트의 기존 테이블을 덮어쓸 수 없습니다.

      테이블 복사

    • 확인을 클릭합니다.

  9. 확인을 클릭한 후 복사 작업이 자동으로 생성되면 임시(캐시) 테이블을 복사하여 새 테이블을 만듭니다. 작업이 완료되면 탐색창에 새 테이블이 표시됩니다.

쿼리 결과를 Google 스프레드시트에 저장

쿼리 결과를 Google 스프레드시트에 저장하려면 다음 안내를 따릅니다.

기본 UI

  1. BigQuery 웹 UI로 이동합니다.
    BigQuery 웹 UI로 이동

  2. 쿼리 작성 버튼을 클릭합니다.

  3. 새 쿼리 텍스트 영역에 유효한 SQL 쿼리를 입력합니다.

  4. 옵션 표시를 클릭합니다.

  5. (선택사항) 처리 위치에서 미지정을 클릭하고 데이터의 위치를 선택합니다.

  6. 쿼리 실행을 클릭합니다.

  7. 결과가 반환되면 쿼리 결과 위에 있는 Google 스프레드시트에 저장 버튼을 클릭합니다.

    다운로드 및 저장 버튼 스크린샷

  8. 필요한 경우, 메시지를 따라 Google 계정에 로그인하고 허용을 클릭하여 Google 드라이브 MY Drive 폴더에 데이터를 쓸 수 있는 권한을 BigQuery에 제공합니다.

    메시지를 따른 후에 'BigQuery 클라이언트 도구가 Google 계정에 연결되었습니다'라는 제목의 이메일이 수신됩니다. 이메일에는 사용자가 부여한 권한과 권한 제거 단계에 대한 정보가 있습니다.

  9. 결과가 저장되면 기본 BigQuery 웹 UI의 쿼리 결과 위에 Results saved to Google Sheets. Click to view와 같은 메시지가 표시됩니다. 메시지 내 링크를 클릭하여 Google 스프레드시트에서 결과를 보거나 MY Drive 폴더로 이동하여 수동으로 파일을 엽니다.

    쿼리 결과를 Google 스프레드시트에 저장하면 파일 이름이 results-[DATE]로 시작됩니다. 여기에서 [DATE]YYYYMMDD 형식의 오늘 날짜입니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.