파티션을 나눈 테이블 만들기

이 페이지에서는 BigQuery에서 파티션을 나눈 테이블을 만드는 방법을 설명합니다. 파티션을 나눈 테이블의 개요는 파티션을 나눈 테이블 소개를 참조하세요.

시작하기 전에

사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여합니다.

필수 권한

테이블을 만들려면 다음 IAM 권한이 필요합니다.

  • bigquery.tables.create
  • bigquery.tables.updateData
  • bigquery.jobs.create

또한 테이블에 기록하는 데이터에 액세스하기 위해 bigquery.tables.getData 권한이 필요할 수 있습니다.

다음과 같은 사전 정의된 각 IAM 역할에는 테이블을 만드는 데 필요한 권한이 포함되어 있습니다.

  • roles/bigquery.dataEditor
  • roles/bigquery.dataOwner
  • roles/bigquery.admin(bigquery.jobs.create 권한 포함)
  • roles/bigquery.user(bigquery.jobs.create 권한 포함)
  • roles/bigquery.jobUser(bigquery.jobs.create 권한 포함)

또한 bigquery.datasets.create 권한이 있으면 만들 데이터 세트에서 테이블을 만들고 업데이트할 수 있습니다.

BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.

파티션을 나눈 빈 테이블 만들기

BigQuery에서 파티션을 나눈 테이블을 만드는 단계는 표준 테이블을 만드는 방법과 비슷하지만 다른 테이블 옵션과 함께 파티션 나누기 옵션을 지정한다는 점이 다릅니다.

시간 단위 열로 파티션을 나눈 테이블 만들기

스키마 정의가 있는 시간 단위 열로 파티션을 나눈 빈 테이블을 만들려면 다음 안내를 따르세요.

Console

  1. 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 펼친 후 데이터 세트를 선택합니다.
  3. 데이터 세트 정보 섹션에서 테이블 만들기를 클릭합니다.
  4. 테이블 만들기 패널에서 다음 세부정보를 지정합니다.
    1. 소스 섹션의 다음 항목으로 테이블 만들기 목록에서 빈 테이블을 선택합니다.
    2. 대상 섹션에서 다음 세부정보를 지정합니다.
      1. 데이터 세트에서 테이블을 만들 데이터 세트를 선택합니다.
      2. 테이블 필드에 만들려는 테이블의 이름을 입력합니다.
      3. 테이블 유형 필드가 기본 테이블로 설정되어 있는지 확인합니다.
    3. 스키마 섹션에 스키마 정의를 입력합니다. 스키마에는 파티션 나누기 열의 DATE, TIMESTAMP 또는 DATETIME 열이 있어야 합니다. 자세한 내용은 스키마 지정을 참조하세요. 다음 방법 중 하나를 사용하여 스키마 정보를 직접 입력할 수 있습니다.
      • 선택사항 1: 텍스트로 수정을 클릭하고 스키마를 JSON 배열 형식으로 붙여넣습니다. JSON 배열을 사용하는 경우 JSON 스키마 파일 만들기와 동일한 프로세스를 수행하여 스키마를 생성합니다. 다음 명령어를 입력하면 기존 테이블의 스키마를 JSON 형식으로 볼 수 있습니다.
            bq show --format=prettyjson dataset.table
            
      • 선택사항 2: 필드 추가를 클릭하고 테이블 스키마를 입력합니다. 각 필드의 이름, 유형, 모드를 지정합니다.
    4. 파티션 및 클러스터 설정 섹션의 파티션 나누기 목록에서 필드로 파티션 나누기를 선택한 다음 파티션 나누기 열을 선택합니다. 스키마에 DATE, TIMESTAMP 또는 DATETIME 열이 포함된 경우에만 이 옵션을 사용할 수 있습니다.
    5. 선택사항: 이 테이블의 모든 쿼리에 파티션 필터가 필요하면 파티션 필터 필요 체크박스를 선택합니다. 파티션 필터를 사용하여 비용을 줄이고 성능을 높일 수 있습니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.
    6. 파티션 나누기 유형을 선택하여 일일, 시간별, 월간 또는 연간 파티션 나누기를 선택합니다.
    7. 선택사항: 고급 옵션 섹션에서 고객 관리 암호화 키를 사용하려면 고객 관리 암호화 키(CMEK) 사용 옵션을 선택합니다. 기본적으로 BigQuery는 Google 관리 키를 사용하여 저장된 고객 콘텐츠를 암호화합니다.
    8. 테이블 만들기를 클릭합니다.
    9. 테이블 만들기를 클릭합니다.

SQL

시간 단위 열로 파티션을 나눈 테이블을 만들려면 PARTITION BY이 있는 CREATE TABLE DDL 문을 사용합니다.

다음 예시에서는 transaction_date 열을 기준으로 일일 파티션이 있는 테이블을 만듭니다.

  1. 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);
    

    OPTIONS을 사용하여 파티션 만료 시간파티션 필터 요구사항과 같은 테이블 옵션을 설정합니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

DATE 열의 기본 파티션 나누기 유형은 일일 파티션 나누기입니다. 다른 파티션 나누기 유형을 지정하려면 PARTITION BY 절에 DATE_TRUNC 함수를 포함합니다. 예를 들어 다음 쿼리에서는 월간 파티션이 있는 테이블을 만듭니다.

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_date DATE)
PARTITION BY
  DATE_TRUNC(transaction_date, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

또한 TIMESTAMP 또는 DATETIME 열을 파티션 나누기 열로 지정할 수 있습니다. 이 경우 PARTITION BY 절에 TIMESTAMP_TRUNC 또는 DATETIME_TRUNC 함수를 포함하여 파티션 유형을 지정합니다. 예를 들어 다음 문은 TIMESTAMP 열을 기준으로 일일 파티션이 포함된 테이블을 만듭니다.

CREATE TABLE
  mydataset.newtable (transaction_id INT64, transaction_ts TIMESTAMP)
PARTITION BY
  TIMESTAMP_TRUNC(transaction_ts, DAY)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

bq mk 명령어를 --table 플래그(또는 -t 단축키)와 함께 사용합니다.

bq mk \
    --table \
    --schema SCHEMA \
    --time_partitioning_field COLUMN \
    --time_partitioning_type UNIT_TIME \
    --time_partitioning_expiration EXPIRATION_TIME \
    --require_partition_filter=BOOLEAN
    PROJECT_ID:DATASET.TABLE

다음을 바꿉니다.

  • SCHEMA: column:data_type,column:data_type 형식의 스키마 정의 또는 로컬 머신의 JSON 스키마 파일 경로입니다. 자세한 내용은 스키마 지정을 참조하세요.
  • COLUMN: 파티션 나누기 열의 이름입니다. 테이블 스키마에서 이 열은 TIMESTAMP, DATETIME 또는 DATE 유형이어야 합니다.
  • UNIT_TIME: 파티션 나누기 유형입니다. 지원되는 값은 DAY, HOUR, MONTH 또는 YEAR입니다.
  • EXPIRATION_TIME: 테이블 파티션 만료 시간(초)입니다. --time_partitioning_expiration 플래그는 선택사항입니다. 자세한 내용은 파티션 만료 시간 설정을 참조하세요.
  • BOOLEAN: true이면 이 테이블의 쿼리에 파티션 필터가 포함되어야 합니다. --require_partition_filter 플래그는 선택사항입니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.
  • PROJECT_ID: 프로젝트 ID입니다. 생략하면 기본 프로젝트가 사용됩니다.
  • DATASET: 프로젝트의 데이터 세트 이름입니다.
  • TABLE: 만들 테이블의 이름입니다.

다른 명령줄 옵션은 bq mk를 참조하세요.

다음 예시에서는 시간별 파티션 나누기를 사용하여 ts 열에서 파티션을 나눈 mytable이라는 테이블을 만듭니다. 파티션 만료 시간은 259,200초(3일)입니다.

bq mk \
    -t \
    --schema 'ts:TIMESTAMP,qtr:STRING,sales:FLOAT' \
    --time_partitioning_field ts \
    --time_partitioning_type HOUR \
    --time_partitioning_expiration 259200  \
    mydataset.mytable

API

timePartitioning 속성과 schema 속성을 지정하는 테이블 리소스가 정의된 tables.insert 메서드를 호출합니다.

Go

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

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// createTablePartitioned demonstrates creating a table and specifying a time partitioning configuration.
func createTablePartitioned(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydatasetid"
	// tableID := "mytableid"
	ctx := context.Background()

	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	sampleSchema := bigquery.Schema{
		{Name: "name", Type: bigquery.StringFieldType},
		{Name: "post_abbr", Type: bigquery.IntegerFieldType},
		{Name: "date", Type: bigquery.DateFieldType},
	}
	metadata := &bigquery.TableMetadata{
		TimePartitioning: &bigquery.TimePartitioning{
			Field:      "date",
			Expiration: 90 * 24 * time.Hour,
		},
		Schema: sampleSchema,
	}
	tableRef := client.Dataset(datasetID).Table(tableID)
	if err := tableRef.Create(ctx, metadata); err != nil {
		return err
	}
	return nil
}

자바

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;
import com.google.cloud.bigquery.TimePartitioning;

// Sample to create a partition table
public class CreatePartitionedTable {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    Schema schema =
        Schema.of(
            Field.of("name", StandardSQLTypeName.STRING),
            Field.of("post_abbr", StandardSQLTypeName.STRING),
            Field.of("date", StandardSQLTypeName.DATE));
    createPartitionedTable(datasetName, tableName, schema);
  }

  public static void createPartitionedTable(String datasetName, String tableName, Schema schema) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      TimePartitioning partitioning =
          TimePartitioning.newBuilder(TimePartitioning.Type.DAY)
              .setField("date") //  name of column to use for partitioning
              .setExpirationMs(7776000000L) // 90 days
              .build();

      StandardTableDefinition tableDefinition =
          StandardTableDefinition.newBuilder()
              .setSchema(schema)
              .setTimePartitioning(partitioning)
              .build();
      TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

      bigquery.create(tableInfo);
      System.out.println("Partitioned table created successfully");
    } catch (BigQueryException e) {
      System.out.println("Partitioned table was not created. \n" + e.toString());
    }
  }
}

Node.js

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

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createTablePartitioned() {
  // Creates a new partitioned table named "my_table" in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";
  const schema = 'Name:string, Post_Abbr:string, Date:date';

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    schema: schema,
    location: 'US',
    timePartitioning: {
      type: 'DAY',
      expirationMS: '7776000000',
      field: 'date',
    },
  };

  // Create a new table in the dataset
  const [table] = await bigquery
    .dataset(datasetId)
    .createTable(tableId, options);
  console.log(`Table ${table.id} created with partitioning: `);
  console.log(table.metadata.timePartitioning);
}

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, 'my_dataset')

table_ref = dataset_ref.table("my_partitioned_table")
schema = [
    bigquery.SchemaField("name", "STRING"),
    bigquery.SchemaField("post_abbr", "STRING"),
    bigquery.SchemaField("date", "DATE"),
]
table = bigquery.Table(table_ref, schema=schema)
table.time_partitioning = bigquery.TimePartitioning(
    type_=bigquery.TimePartitioningType.DAY,
    field="date",  # name of column to use for partitioning
    expiration_ms=7776000000,
)  # 90 days

table = client.create_table(table)

print(
    "Created table {}, partitioned on column {}".format(
        table.table_id, table.time_partitioning.field
    )
)

수집 시간으로 파티션을 나눈 테이블 만들기

스키마 정의가 있는 수집 시간으로 파티션을 나눈 빈 테이블을 만들려면 다음 안내를 따르세요.

Console

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

    BigQuery 페이지로 이동

  2. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  3. 작업 옵션을 펼치고 열기를 클릭합니다.

  4. 세부정보 패널에서 테이블 만들기를 클릭합니다.

  5. 테이블 만들기 페이지의 소스 섹션에서 빈 테이블을 선택합니다.

  6. 대상 섹션에서 다음을 수행합니다.

    • 데이터 세트 이름에서 적절한 데이터 세트를 선택합니다.
    • 테이블 이름 필드에 테이블 이름을 입력합니다.
    • 테이블 유형기본 테이블로 설정되어 있는지 확인합니다.
  7. 스키마 섹션에 스키마 정의를 입력합니다.

  8. 파티션 및 클러스터 설정 섹션에서 파티션 나누기수집 시간으로 파티션 나누기를 클릭합니다.

  9. (선택사항) 이 테이블의 모든 쿼리에 파티션 필터가 필요하면 파티션 필터 필요 체크박스를 선택합니다. 파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 향상시킬 수 있습니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.

  10. 테이블 만들기를 클릭합니다.

SQL

수집 시간으로 파티션을 나눈 테이블을 만들려면 _PARTITIONDATE에서 파티션을 나눈 PARTITION BY이 있는 CREATE TABLE을 사용합니다.

다음 예시에서는 일일 파티션이 포함된 테이블을 만듭니다.

  1. 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE TABLE
      mydataset.newtable (transaction_id INT64)
    PARTITION BY
      _PARTITIONDATE
      OPTIONS (
        partition_expiration_days = 3,
        require_partition_filter = TRUE);
    

    OPTIONS을 사용하여 파티션 만료 시간파티션 필터 요구사항과 같은 테이블 옵션을 설정합니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

수집 시간으로 파티션 나누기의 기본 파티션 나누기 유형은 일일 파티션 나누기입니다. 다른 파티션 나누기 유형을 지정하려면 PARTITION BY 절에 DATE_TRUNC 함수를 포함합니다. 예를 들어 다음 쿼리에서는 월간 파티션이 있는 테이블을 만듭니다.

CREATE TABLE
  mydataset.newtable (transaction_id INT64)
PARTITION BY
  DATE_TRUNC(_PARTITIONTIME, MONTH)
  OPTIONS (
    partition_expiration_days = 3,
    require_partition_filter = TRUE);

bq

bq mk 명령어를 --table 플래그(또는 -t 단축키)와 함께 사용합니다.

bq mk \
    --table \
    --schema SCHEMA \
    --time_partitioning_type UNIT_TIME \
    --time_partitioning_expiration EXPIRATION_TIME \
    --require_partition_filter=BOOLEAN  \
    PROJECT_ID:DATASET.TABLE

다음을 바꿉니다.

  • SCHEMA: column:data_type,column:data_type 형식의 정의 또는 로컬 머신의 JSON 스키마 파일 경로입니다. 자세한 내용은 스키마 지정을 참조하세요.
  • UNIT_TIME: 파티션 나누기 유형입니다. 지원되는 값은 DAY, HOUR, MONTH 또는 YEAR입니다.
  • EXPIRATION_TIME: 테이블 파티션 만료 시간(초)입니다. --time_partitioning_expiration 플래그는 선택사항입니다. 자세한 내용은 파티션 만료 시간 설정을 참조하세요.
  • BOOLEAN: true이면 이 테이블의 쿼리에 파티션 필터가 포함되어야 합니다. --require_partition_filter 플래그는 선택사항입니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.
  • PROJECT_ID: 프로젝트 ID입니다. 생략하면 기본 프로젝트가 사용됩니다.
  • DATASET: 프로젝트의 데이터 세트 이름입니다.
  • TABLE: 만들 테이블의 이름입니다.

다른 명령줄 옵션은 bq mk를 참조하세요.

다음 예시에서는 mytable이라는 수집 시간으로 파티션을 나눈 테이블을 만듭니다. 테이블에는 파티션 만료 시간이 259,200초(3일)인 일일 파티션 나누기가 있습니다.

bq mk \
    -t \
    --schema qtr:STRING,sales:FLOAT,year:STRING \
    --time_partitioning_type DAY \
    --time_partitioning_expiration 259200 \
    mydataset.mytable

API

timePartitioning 속성과 schema 속성을 지정하는 테이블 리소스가 정의된 tables.insert 메서드를 호출합니다.

정수 범위로 파티션을 나눈 테이블 만들기

스키마 정의가 있는 정수 범위로 파티션을 나눈 빈 테이블을 만들려면 다음 안내를 따르세요.

Console

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

    BigQuery 페이지로 이동

  2. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  3. 작업 옵션을 펼치고 열기를 클릭합니다.

  4. 세부정보 패널에서 테이블 만들기를 클릭합니다.

  5. 테이블 만들기 페이지의 소스 섹션에서 빈 테이블을 선택합니다.

  6. 대상 섹션에서 다음을 수행합니다.

    • 데이터 세트 이름에서 적절한 데이터 세트를 선택합니다.
    • 테이블 이름 필드에 테이블 이름을 입력합니다.
    • 테이블 유형기본 테이블로 설정되어 있는지 확인합니다.
  7. 스키마 섹션에 스키마 정의를 입력합니다. 스키마에 파티션 나누기 열의 INTEGER 열이 포함되어 있는지 확인합니다. 자세한 내용은 스키마 지정을 참조하세요.

  8. 파티션 및 클러스터 설정 섹션의 파티션 나누기 드롭다운 목록에서 필드로 파티션 나누기를 선택하고 파티션 나누기 열을 선택합니다. 스키마에 INTEGER 열이 포함된 경우에만 이 옵션을 사용할 수 있습니다.

  9. Start, End, Interval 값을 제공합니다.

    • Start는 첫 번째 파티션 범위의 시작입니다(해당 값 포함).
    • End는 마지막 파티션 범위의 끝입니다(해당 값 제외).
    • Interval은 각 파티션 범위의 너비입니다.

    이 범위를 벗어나는 값은 특수 __UNPARTITIONED__ 파티션으로 이동합니다.

  10. (선택사항) 이 테이블의 모든 쿼리에 파티션 필터가 필요하면 파티션 필터 필요 체크박스를 선택합니다. 파티션 필터를 필수항목으로 설정하면 비용을 줄이고 성능을 향상시킬 수 있습니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.

  11. 테이블 만들기를 클릭합니다.

SQL

정수 범위로 파티션을 나눈 테이블을 만들려면 PARTITION BY이 있는 CREATE TABLE DDL 문을 사용합니다.

다음 예시에서는 start 0, end 100, interval 10으로 customer_id 열에서 파티션을 나눈 테이블을 만듭니다.

  1. 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE TABLE mydataset.newtable (customer_id INT64, date1 DATE)
    PARTITION BY
      RANGE_BUCKET(customer_id, GENERATE_ARRAY(0, 100, 10))
      OPTIONS (
        require_partition_filter = TRUE);
    

    OPTIONS을 사용하여 파티션 필터 요구사항과 같은 테이블 옵션을 설정합니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

bq mk 명령어를 --table 플래그(또는 -t 단축키)와 함께 사용합니다.

bq mk \
    --schema schema \
    --range_partitioning=COLUMN_NAME,START,END,INTERVAL \
    --require_partition_filter=BOOLEAN  \
    PROJECT_ID:DATASET.TABLE

다음을 바꿉니다.

  • SCHEMA: column:data_type,column:data_type 형식의 인라인 스키마 정의 또는 로컬 머신의 JSON 스키마 파일 경로입니다. 자세한 내용은 스키마 지정을 참조하세요.
  • COLUMN_NAME: 파티션 나누기 열의 이름입니다. 테이블 스키마에서 이 열은 INTEGER 유형이어야 합니다.
  • START: 첫 번째 파티션 범위의 시작입니다(해당 값 포함).
  • END: 마지막 파티션 범위의 끝입니다(해당 값 제외).
  • INTERVAL: 각 파티션 범위의 너비입니다.
  • BOOLEAN: true이면 이 테이블의 쿼리에 파티션 필터가 포함되어야 합니다. --require_partition_filter 플래그는 선택사항입니다. 자세한 내용은 파티션 필터 요구사항 설정을 참조하세요.
  • PROJECT_ID: 프로젝트 ID입니다. 생략하면 기본 프로젝트가 사용됩니다.
  • DATASET: 프로젝트의 데이터 세트 이름입니다.
  • TABLE: 만들 테이블의 이름입니다.

파티션 범위를 벗어나는 값은 특수 __UNPARTITIONED__ 파티션으로 이동합니다.

다른 명령줄 옵션은 bq mk를 참조하세요.

다음 예시에서는 customer_id 열에서 파티션을 나눈 mytable이라는 테이블을 만듭니다.

bq mk \
    -t \
    --schema 'customer_id:INTEGER,qtr:STRING,sales:FLOAT' \
    --range_partitioning=customer_id,0,100,10 \
    mydataset.mytable

API

rangePartitioning 속성과 schema 속성을 지정하는 테이블 리소스가 정의된 tables.insert 메서드를 호출합니다.

자바

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

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Field;
import com.google.cloud.bigquery.RangePartitioning;
import com.google.cloud.bigquery.Schema;
import com.google.cloud.bigquery.StandardSQLTypeName;
import com.google.cloud.bigquery.StandardTableDefinition;
import com.google.cloud.bigquery.TableId;
import com.google.cloud.bigquery.TableInfo;

// Sample to create a range partitioned table
public class CreateRangePartitionedTable {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    Schema schema =
        Schema.of(
            Field.of("integerField", StandardSQLTypeName.INT64),
            Field.of("stringField", StandardSQLTypeName.STRING),
            Field.of("booleanField", StandardSQLTypeName.BOOL),
            Field.of("dateField", StandardSQLTypeName.DATE));
    createRangePartitionedTable(datasetName, tableName, schema);
  }

  public static void createRangePartitionedTable(
      String datasetName, String tableName, Schema schema) {
    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();

      TableId tableId = TableId.of(datasetName, tableName);

      // Note: The field must be a top- level, NULLABLE/REQUIRED field.
      // The only supported type is INTEGER/INT64
      RangePartitioning partitioning =
          RangePartitioning.newBuilder()
              .setField("integerField")
              .setRange(
                  RangePartitioning.Range.newBuilder()
                      .setStart(1L)
                      .setInterval(2L)
                      .setEnd(10L)
                      .build())
              .build();

      StandardTableDefinition tableDefinition =
          StandardTableDefinition.newBuilder()
              .setSchema(schema)
              .setRangePartitioning(partitioning)
              .build();
      TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();

      bigquery.create(tableInfo);
      System.out.println("Range partitioned table created successfully");
    } catch (BigQueryException e) {
      System.out.println("Range partitioned table was not created. \n" + e.toString());
    }
  }
}

Node.js

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

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function createTableRangePartitioned() {
  // Creates a new integer range partitioned table named "my_table"
  // in "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  const schema = [
    {name: 'fullName', type: 'STRING'},
    {name: 'city', type: 'STRING'},
    {name: 'zipcode', type: 'INTEGER'},
  ];

  // To use integer range partitioning, select a top-level REQUIRED or
  // NULLABLE column with INTEGER / INT64 data type. Values that are
  // outside of the range of the table will go into the UNPARTITIONED
  // partition. Null values will be in the NULL partition.
  const rangePartition = {
    field: 'zipcode',
    range: {
      start: 0,
      end: 100000,
      interval: 10,
    },
  };

  // For all options, see https://cloud.google.com/bigquery/docs/reference/v2/tables#resource
  const options = {
    schema: schema,
    rangePartitioning: rangePartition,
  };

  // Create a new table in the dataset
  const [table] = await bigquery
    .dataset(datasetId)
    .createTable(tableId, options);

  console.log(`Table ${table.id} created with integer range partitioning: `);
  console.log(table.metadata.rangePartitioning);
}

Python

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

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"

schema = [
    bigquery.SchemaField("full_name", "STRING"),
    bigquery.SchemaField("city", "STRING"),
    bigquery.SchemaField("zipcode", "INTEGER"),
]

table = bigquery.Table(table_id, schema=schema)
table.range_partitioning = bigquery.RangePartitioning(
    # To use integer range partitioning, select a top-level REQUIRED /
    # NULLABLE column with INTEGER / INT64 data type.
    field="zipcode",
    range_=bigquery.PartitionRange(start=0, end=100000, interval=10),
)
table = client.create_table(table)  # Make an API request.
print(
    "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
)

쿼리 결과에서 파티션을 나눈 테이블 만들기

다음 방법으로 쿼리 결과에서 파티션을 나눈 테이블을 만들 수 있습니다.

  • SQL에서는 CREATE TABLE ... AS SELECT 문을 사용합니다. 이 방식을 사용하여 수집 시간이 아닌 시간 단위 열이나 정수 범위로 파티션을 나눈 테이블을 만들 수 있습니다.
  • bq 명령줄 도구나 BigQuery API를 사용하여 쿼리의 대상 테이블을 설정합니다. 쿼리가 실행되면 BigQuery에서 결과를 대상 테이블에 씁니다. 모든 파티션 나누기 유형에 이 방법을 사용할 수 있습니다.
  • jobs.insert API 메서드를 호출하고 timePartitioning 속성 또는 rangePartitioning 속성에 파티션 나누기를 지정합니다.

SQL

쿼리에 SELECT AS 절이 있는 CREATE TABLE 문을 사용합니다. PARTITION BY 절을 포함하여 파티션 나누기를 구성합니다.

다음 예시에서는 transaction_date 열에서 파티션을 나눈 테이블을 만듭니다.

  1. 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    CREATE TABLE
      mydataset.newtable (transaction_id INT64, transaction_date DATE)
    PARTITION BY
      transaction_date
    AS (
      SELECT
        transaction_id, transaction_date
      FROM
        mydataset.mytable
    );
    

    OPTIONS을 사용하여 파티션 필터 요구사항과 같은 테이블 옵션을 설정합니다.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

쿼리에서 파티션을 나눈 테이블을 만들려면 bq query 명령어를 --destination_table 플래그 및 --time_partitioning_type 플래그와 함께 사용합니다.

시간 단위 열로 파티션 나누기:

bq query \
    --use_legacy_sql=false \
    --destination_table TABLE_NAME \
    --time_partitioning_field COLUMN \
    --time_partitioning_type UNIT_TIME \
    'QUERY_STATEMENT'

수집 시간으로 파티션 나누기:

bq query \
    --use_legacy_sql=false \
    --destination_table TABLE_NAME \
    --time_partitioning_type UNIT_TIME \
    'QUERY_STATEMENT'

정수 범위로 파티션 나누기:

bq query \
    --use_legacy_sql=false \
    --destination_table PROJECT_ID:DATASET.TABLE \
    --range_partitioning COLUMN,START,END,INTERVAL \
    'QUERY_STATEMENT'

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다. 생략하면 기본 프로젝트가 사용됩니다.
  • DATASET: 프로젝트의 데이터 세트 이름입니다.
  • TABLE: 만들 테이블의 이름입니다.
  • COLUMN: 파티션 나누기 열의 이름입니다.
  • UNIT_TIME: 파티션 나누기 유형입니다. 지원되는 값은 DAY, HOUR, MONTH 또는 YEAR입니다.
  • START: 파티션 나누기 범위의 시작입니다(해당 값 포함).
  • END: 파티션 나누기 범위의 끝입니다(해당 값 제외).
  • INTERVAL: 파티션 내 각 범위의 너비입니다.
  • QUERY_STATEMENT: 테이블을 채우는 데 사용되는 쿼리입니다.

다음 예시에서는 월별 파티션 나누기를 사용하여 transaction_date 열에서 파티션을 나눈 테이블을 만듭니다.

bq query \
    --use_legacy_sql=false \
    --destination_table mydataset.newtable \
    --time_partitioning_field transaction_date \
    --time_partitioning_type MONTH \
    'SELECT transaction_id, transaction_date FROM mydataset.mytable'

다음 예시에서는 정수 범위 파티션 나누기를 사용하여 customer_id 열에서 파티션을 나눈 테이블을 만듭니다.

bq query \
    --use_legacy_sql=false \
    --destination_table mydataset.newtable \
    --range_partitioning customer_id,0,100,10 \
    'SELECT * FROM mydataset.ponies'

수집 시간으로 파티션을 나눈 테이블의 경우 파티션 데코레이터를 사용하여 특정 파티션에 데이터를 로드할 수도 있습니다. 다음 예시에서는 수집 시간으로 파티션을 나눈 새 테이블을 만들고 20180201(2018년 2월 1일) 파티션에 데이터를 로드합니다.

bq query \
    --use_legacy_sql=false  \
    --time_partitioning_type=DAY \
    --destination_table='newtable$20180201' \
    'SELECT * FROM mydataset.mytable'

API

쿼리 결과를 파티션을 나눈 테이블에 저장하려면 jobs.insert 메서드를 호출합니다. query 작업을 구성합니다. destinationTable에 대상 테이블을 지정합니다. timePartitioning 속성 또는 rangePartitioning 속성에서 파티션 나누기를 지정합니다.

날짜로 샤딩된 테이블을 수집 시간으로 파티션을 나눈 테이블로 변환

이전에 날짜로 샤딩된 테이블을 만든 경우 bq 명령줄 도구에서 partition 명령어를 사용하여 전체 관련 테이블 세트를 수집 시간으로 파티션을 나눈 테이블 하나로 변환할 수 있습니다.

bq --location=LOCATION partition \
    --time_partitioning_type=PARTITION_TYPE \
    --time_partitioning_expiration INTEGER \
    PROJECT_ID:SOURCE_DATASET.SOURCE_TABLE \
    PROJECT_ID:DESTINATION_DATASET.DESTINATION_TABLE

다음을 바꿉니다.

  • LOCATION: 위치 이름입니다. --location 플래그는 선택사항입니다.
  • PARTITION_TYPE: 파티션 유형입니다. 가능한 값은 DAY, HOUR, MONTH 또는 YEAR입니다.
  • INTEGER: 파티션 만료 시간(초)입니다. 최솟값은 없습니다. 만료 시간은 파티션의 UTC 날짜에 정수 값을 더한 값입니다. time_partitioning_expiration 플래그는 선택사항입니다.
  • PROJECT_ID: 프로젝트 ID입니다.
  • SOURCE_DATASET: 날짜로 샤딩된 테이블이 포함된 데이터 세트입니다.
  • SOURCE_TABLE: 날짜로 샤딩된 테이블의 프리픽스입니다.
  • DESTINATION_DATASET: 파티션을 나눈 새 테이블의 데이터 세트입니다.
  • DESTINATION_TABLE: 만들려는 파티션을 나눈 테이블의 이름입니다.

partition 명령어는 --label, --expiration 또는 --description 플래그를 지원하지 않습니다. 파티션을 나눈 테이블이 생성되면 테이블에 라벨, 테이블 만료 시간, 설명을 추가할 수 있습니다.

partition 명령어를 실행하면 BigQuery가 샤딩된 테이블에서 파티션을 생성하는 복사 작업을 만듭니다.

다음 예시에서는 sourcetable_ 프리픽스가 있는 날짜로 샤딩된 테이블 세트에서 mytable_partitioned라는 수집 시간으로 파티션을 나눈 테이블을 만듭니다. 새 테이블 파티션은 매일 나뉘며 파티션 만료 시간은 259,200초(3일)입니다.

bq partition \
    --time_partitioning_type=DAY \
    --time_partitioning_expiration 259200 \
    mydataset.sourcetable_ \
    mydataset.mytable_partitioned

날짜로 샤딩된 테이블이 sourcetable_20180126sourcetable_20180127이면 이 명령어는 mydataset.mytable_partitioned$20180126mydataset.mytable_partitioned$20180127 파티션을 만듭니다.

파티션을 나눈 테이블 보안

파티션을 나눈 테이블의 액세스 제어는 표준 테이블의 액세스 제어와 동일합니다. 자세한 내용은 테이블 액세스 제어 소개를 참조하세요.

다음 단계