パーティション分割テーブルの作成

このページでは、BigQuery でパーティション分割テーブルを作成する方法について説明します。パーティション分割テーブルの概要については、パーティション分割テーブルの概要をご覧ください。

必要な権限

テーブルを作成するには、少なくとも次の権限が付与されている必要があります。

  • bigquery.tables.create(テーブルを作成する権限)
  • bigquery.tables.updateData(読み込みジョブ、クエリジョブ、コピージョブを使用してテーブルにデータを書き込む権限)
  • bigquery.jobs.create(テーブルにデータを書き込むクエリジョブ、読み込みジョブ、コピージョブを実行する権限)

テーブルに書き込むデータにアクセスするには、bigquery.tables.getData などの追加の権限が必要になる場合があります。

次の事前定義済みの IAM ロールには bigquery.tables.create 権限と bigquery.tables.updateData 権限の両方が含まれています。

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

次の事前定義済みの IAM ロールには bigquery.jobs.create 権限が含まれています。

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権があれば、データセット内でテーブルを作成および更新できます。

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

空のパーティション分割テーブルを作成する

BigQuery でパーティション分割テーブルを作成する手順は、任意のテーブル オプションに加えてパーティショニング オプションを指定する点を除き、標準テーブルを作成する手順と同様です。

時間単位列パーティション分割テーブルを作成する

スキーマ定義を持つ空の時間単位列パーティション分割テーブルを作成するには:

Console

  1. Cloud Console で [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. [エクスプローラ] パネルでプロジェクトを展開し、データセットを選択します。

  3. [アクション] オプションを開き、[開く] をクリックします。

  4. 詳細パネルで [テーブルを作成] をクリックします。

  5. [テーブルの作成] ページの [ソース] セクションで、[空のテーブル] を選択します。

  6. [送信先] で次の操作を行います。

    • [データセット名] で、該当するデータセットを選択します。
    • [テーブル名] フィールドに、テーブルの名前を入力します。
    • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。
  7. [スキーマ] セクションでスキーマ定義を入力します。スキーマに、パーティショニング列として DATE 列、TIMESTAMP 列、DATETIME 列のいずれかが含まれていることを確認してください。詳細については、スキーマの指定をご覧ください。

  8. [パーティションとクラスタの設定] セクションの [パーティショニング] プルダウン リストで、[フィールドにより分割] を選択して、パーティショニング列を選びます。このオプションは、スキーマに DATE 列、TIMESTAMP 列、または DATETIME 列が含まれている場合にのみ使用できます。

  9. [パーティショニング タイプ] を選択して、1 日ごと、1 時間ごと、月別、年別のいずれかのパーティショニングを選択します。

  10. (省略可)このテーブルのすべてのクエリでパーティション フィルタを要求するには、[パーティション フィルタを要求] チェックボックスをオンにします。パーティション フィルタを要求すると、コストが削減され、パフォーマンスが向上する場合があります。詳細については、パーティション分割テーブルのクエリをご覧ください。

  11. [テーブルを作成] をクリックします。

SQL

時間単位列パーティション分割テーブルを作成するには、PARTITION BYを指定した CREATE TABLE ステートメントを使用します。

次の例では、transaction_date 列に基づいた 1 日ごとのパーティションを含むテーブルが作成されます。

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

DATE 列のデフォルトのパーティショニング タイプは 1 日ごとのパーティショニングです。別のパーティショニング タイプを指定するには、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 列に基づいて 1 日ごとのパーティションを含むテーブルを作成します。

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

--table フラグ(または -t ショートカット)を指定して、bq mk コマンドを使用します。

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: パーティショニング タイプ。サポートされる値は、DAYHOURMONTH、または YEAR です。
  • EXPIRATION_TIME: テーブルのパーティションの有効期限(秒単位)。--time_partitioning_expiration フラグは省略可能です。
  • BOOLEAN: true の場合、このテーブルのクエリにはパーティション フィルタを含める必要があります。--require_partition_filter フラグは省略可能です。
  • PROJECT_ID: プロジェクト ID。省略した場合は、デフォルトのプロジェクトが使用されます。
  • DATASET: プロジェクト内のデータセットの名前。
  • TABLE: 作成するテーブルの名前。

他のコマンドライン オプションについては、bq mk をご覧ください。

次の例では、1 時間ごとのパーティショニングを使用して 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
}

Java

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、BigQuery Java 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. Cloud Console で [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. [エクスプローラ] パネルでプロジェクトを展開し、データセットを選択します。

  3. [アクション] オプションを開き、[開く] をクリックします。

  4. 詳細パネルで [テーブルを作成] をクリックします。

  5. [テーブルの作成] ページの [ソース] セクションで、[空のテーブル] を選択します。

  6. [送信先] で次の操作を行います。

    • [データセット名] で、該当するデータセットを選択します。
    • [テーブル名] フィールドに、テーブルの名前を入力します。
    • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。
  7. [スキーマ] セクションでスキーマ定義を入力します。

  8. [パーティションとクラスタの設定] セクションの [パーティショニング] で、[取り込み時間により分割] をクリックします。

  9. (省略可)このテーブルのすべてのクエリでパーティション フィルタを要求するには、[パーティション フィルタを要求] チェックボックスをオンにします。パーティション フィルタを要求すると、コストが削減され、パフォーマンスが向上する場合があります。詳細については、パーティション分割テーブルのクエリをご覧ください。

  10. [テーブルを作成] をクリックします。

SQL

取り込み時間パーティション分割テーブルを作成するには、_PARTITIONTIME でパーティショニングする PARTITION BYを指定した CREATE TABLE ステートメントを使用します。

次の例では、1 日ごとのパーティションを含むテーブルを作成しています。

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

取り込み時間パーティショニングのデフォルトのパーティショニング タイプは、1 日ごとのパーティショニングです。別のパーティショニング タイプを指定するには、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

--table フラグ(または -t ショートカット)を指定して、bq mk コマンドを使用します。

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: パーティショニング タイプ。サポートされる値は、DAYHOURMONTH、または YEAR です。
  • EXPIRATION_TIME: テーブルのパーティションの有効期限(秒単位)。--time_partitioning_expiration フラグは省略可能です。
  • BOOLEAN: true の場合、このテーブルのクエリにはパーティション フィルタを含める必要があります。--require_partition_filter フラグは省略可能です。
  • PROJECT_ID: プロジェクト ID。省略した場合は、デフォルトのプロジェクトが使用されます。
  • DATASET: プロジェクト内のデータセットの名前。
  • TABLE: 作成するテーブルの名前。

他のコマンドライン オプションについては、bq mk をご覧ください。

次の例では、mytable という名前の取り込み時間パーティション分割テーブルを作成します。このテーブルには 1 日ごとのパーティショニングがあり、パーティションの有効期限が 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. Cloud Console で [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. [エクスプローラ] パネルでプロジェクトを展開し、データセットを選択します。

  3. [アクション] オプションを開き、[開く] をクリックします。

  4. 詳細パネルで [テーブルを作成] をクリックします。

  5. [テーブルの作成] ページの [ソース] セクションで、[空のテーブル] を選択します。

  6. [送信先] で次の操作を行います。

    • [データセット名] で、該当するデータセットを選択します。
    • [テーブル名] フィールドに、テーブルの名前を入力します。
    • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。
  7. [スキーマ] セクションでスキーマ定義を入力します。スキーマにパーティショニング列に対する INTEGER 列が含まれていることを確認してください。詳細については、スキーマの指定をご覧ください。

  8. [パーティションとクラスタの設定] セクションの [パーティショニング] プルダウン リストで、[フィールドにより分割] を選択して、パーティショニング列を選びます。このオプションは、スキーマに INTEGER 列が含まれている場合にのみ使用できます。

  9. [開始]、[終了]、[間隔] の値を指定します。

    • [開始] は、最初のパーティション範囲の開始値です(この値は含まれる)。
    • [終了] は、最後のパーティション範囲の終了値です(この値は含まれない)。
    • [間隔] は、各パーティション範囲の幅です。

    この範囲外の値は、特定の __UNPARTITIONED__ パーティションに入ります。

  10. (省略可)このテーブルのすべてのクエリでパーティション フィルタを要求するには、[パーティション フィルタを要求] チェックボックスをオンにします。パーティション フィルタを要求すると、コストが削減され、パフォーマンスが向上する場合があります。詳細については、パーティション分割テーブルのクエリをご覧ください。

  11. [テーブルを作成] をクリックします。

SQL

整数範囲パーティション分割テーブルを作成するには、PARTITION BYを指定した CREATE TABLE ステートメントを使用します。

次の例では、customer_id 列でパーティショニングされた、開始 0、終了 100、間隔 10 のテーブルを作成しています。

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
)

クエリの実行方法については、インタラクティブ クエリの実行をご覧ください。

bq

--table フラグ(または -t ショートカット)を指定して、bq mk コマンドを使用します。

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 メソッドを呼び出します。

Java

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、BigQuery Java 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)
)

クエリ結果からパーティション分割テーブルを作成する

クエリ結果からパーティション分割テーブルを作成するには:

  • bq コマンドライン ツールまたは BigQuery API を使用して、クエリに宛先テーブルを設定します。クエリを実行すると、BigQuery は結果を宛先テーブルに書き込みます。この方法は、どのパーティショニング タイプにも使用できます。

  • SQL で CREATE TABLE ... AS SELECT ステートメントを使用します。この方法を使用すると、時間単位列または整数範囲でパーティション分割されたテーブルは作成できますが、取り込み時間でパーティション分割されたテーブルは作成できません。

SQL

クエリには SELECT AS 句を指定した CREATE TABLE ステートメントを使用します。パーティショニングを構成するには、PARTITION BY 句を含めます。

次の例では、transaction_date 列でパーティション分割されたテーブルを作成します。

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

bq

クエリからパーティション分割テーブルを作成するには、--destination_table フラグと --time_partitioning_type フラグを指定した bq query コマンドを使用します。

時間単位列パーティショニング:

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: パーティショニング タイプ。サポートされる値は、DAYHOURMONTH、または YEAR です。
  • START: 範囲パーティショニングの開始値(この値は含まれる)。
  • END: 範囲パーティショニングの終了値(この値は含まれない)。
  • INTERVAL: パーティション内の各範囲の幅。
  • QUERY_STATEMENT: テーブルのデータ入力に使用されるクエリ。

次の例では、月別のパーティショニングを使用して transaction_date 列でパーティショニングされたテーブルを作成しています。

bq query \
  --use_legacy_sql=false
  --destination_table mydataset.newtable
  --time_partitioning_field transaction_id
  --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 プロパティでパーティショニングを指定します。

特定のパーティションへデータを書き込む

パーティション デコレータを使用すると、データを特定のパーティションに書き込むことができます。パーティション デコレータは次の形式になります。

table_name$partition_id

次の例では、テーブルはすでに日付でパーティショニングされていると仮定し、既存のテーブルの 20160501(2016 年 5 月 1 日)パーティションにデータを書き込んでいます。

bq load --source_format=CSV 'mydataset.mytable$20160501' data.csv

クエリの結果を特定のパーティションに書き込むこともできます。

bq query \
  --use_legacy_sql=false  \
  --destination_table='mytable$20160501' \
  --append_table=true \
  'SELECT * FROM mydataset.another_table'

取り込み時間パーティショニングでこの方法を使用すると、古いデータの読み込みや、タイムゾーンの調整を行えます。たとえば、太平洋標準時(PST)を使用している場合、対応するパーティション デコレータ $20160501 を使用すると、2016 年 5 月 1 日(PST)で生成されたデータを、その日付のパーティションに読み込むことができます(デフォルトでは、取り込み時間パーティションは UTC 時間に基づきます)。

時間単位列と整数範囲のパーティション分割テーブルの場合、デコレータで指定されたパーティション ID が、書き込まれるデータと一致する必要があります。たとえば、テーブルが DATE 列でパーティション分割されている場合は、デコレータがその列の値と一致する必要があります。一致していない場合は、エラーが発生します。ただし、データが単一のパーティション内にあることがわかっている場合は、パーティション デコレータを指定することで書き込みパフォーマンスを向上させることができます。

データの読み込みの詳細については、BigQuery へのデータの読み込みの概要をご覧ください。

日付別テーブルを取り込み時間パーティション分割テーブルへ変換する

日付別テーブルを以前に作成している場合は、bq コマンドライン ツールで partition コマンドを使用して、関連する一連のテーブル全体を単一の取り込み時間パーティション分割テーブルに変換できます。

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

次のように置き換えます。

  • LOCATION: ロケーションの名前。--location フラグは省略可能です。
  • PARTITION_TYPE: パーティション タイプ。有効な値は DAYHOURMONTH、または 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 というパーティションを作成します。

テーブルのセキュリティ

BigQuery でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。

次のステップ