テーブル スキーマの変更
このドキュメントでは、既存の BigQuery テーブルのスキーマ定義を変更する方法について説明します。
このドキュメントで説明するスキーマの変更は、SQL データ定義言語(DDL)ステートメントを使用して行えます。これらのステートメントには料金が発生しません。
このページで説明されているすべての方法でテーブル スキーマを変更できます。テーブルデータを Cloud Storage にエクスポートし、変更されたスキーマ定義を使用して新しいテーブルにデータを読み込みます。BigQuery の読み込みジョブとエクスポート ジョブは無料ですが、エクスポートしたデータを Cloud Storage に保存するには料金が発生します。以降のセクションでは、さまざまなスキーマの変更を行うその他の方法について説明します。
列の追加
次のいずれかの方法で、既存のテーブルのスキーマ定義に列を追加できます。
- 新しい空の列を追加します。
- 読み込みジョブまたはクエリジョブでテーブルを上書きします。
- 読み込みジョブまたはクエリジョブを使用してテーブルにデータを追加します。
追加する列は、BigQuery の列名の規則を遵守している必要があります。スキーマ コンポーネントの作成の詳細については、スキーマの指定をご覧ください。
空の列を追加する
既存のテーブル スキーマに新しい列を追加する場合、その列は NULLABLE
または REPEATED
である必要があります。REQUIRED
列を既存のテーブル スキーマに追加することはできません。API または bq コマンドライン ツールで既存のテーブル スキーマに REQUIRED
列を追加すると、エラーが発生します。ネストされた REQUIRED
列は、新しい RECORD
フィールドの一部として作成します。REQUIRED
列を追加できるのは、データの読み込み中にテーブルを作成する場合、またはスキーマ定義を持つ空のテーブルを作成する場合だけです。
テーブルのスキーマ定義に空の列を追加するには:
コンソール
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。
詳細パネルで [スキーマ] タブをクリックします。
[スキーマを編集] をクリックします。このボタンを表示するには、スクロールが必要な場合があります。
[現在のスキーマ] ページの [新しいフィールド] で、[フィールドを追加] をクリックします。
列の追加が完了したら、[保存] をクリックします。
SQL
ALTER TABLE ADD COLUMN
DDL ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
ALTER TABLE mydataset.mytable ADD COLUMN new_column STRING;
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
bq update
コマンドを発行し、JSON スキーマ ファイルを指定します。更新するテーブルがデフォルト以外のプロジェクトにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。
bq update PROJECT_ID:DATASET.TABLE SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシン上の JSON スキーマ ファイルへのパス
インライン スキーマを指定する場合は、列の説明、モード、RECORD
(STRUCT
)型を指定することはできません。すべての列モードはデフォルトで NULLABLE
になります。そのため、ネストされた新しい列を RECORD
に追加する場合は、JSON スキーマ ファイルを指定する必要があります。
インライン スキーマ定義を使用して列を追加しようとする場合は、新しい列を含めてスキーマ定義全体を指定する必要があります。インライン スキーマ定義を使用して列モードを指定することができないため、既存の REPEATED
列を NULLABLE
に変更すると、BigQuery error in update
operation: Provided Schema does not match Table
PROJECT_ID:dataset.table. Field field has changed mode
from REPEATED to NULLABLE.
というエラーが発生します。
bq コマンドライン ツールを使用して既存のテーブルに列を追加する場合に推奨される方法は、JSON スキーマ ファイルを指定することです。
JSON スキーマ ファイルを使用して、テーブルのスキーマに列を追加するには:
まず、
--schema
フラグを指定したbq show
コマンドを発行して、既存のテーブル スキーマをファイルに書き込みます。更新するテーブルがデフォルト以外のプロジェクトにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシンに書き込まれるスキーマ定義ファイル。
たとえば、
mydataset.mytable
のスキーマ定義をファイルに書き込むには、次のコマンドを入力します。mydataset.mytable
はデフォルト プロジェクトにあります。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
スキーマ ファイルをテキスト エディタで開きます。スキーマは次のようになっています。
[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
スキーマ定義の末尾に新しい列を追加します。新しい列を配列内の別の場所に追加しようとすると、
BigQuery error in update operation: Precondition Failed
というエラーが返されます。JSON ファイルを使用して、新しい列の説明、
NULLABLE
またはREPEATED
モード、RECORD
型を指定できます。たとえば、前の手順のスキーマ定義を使用すると、新しい JSON 配列は次のようになります。この例では、新しいNULLABLE
列がcolumn4
という名前で追加されています。column4
に説明が含まれています。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" }, { "description": "my new column", "mode": "NULLABLE", "name": "column4", "type": "STRING" } ]
JSON スキーマ ファイルの操作の詳細については、JSON スキーマ ファイルの指定をご覧ください。
スキーマ ファイルを更新したら、次のコマンドを発行してテーブルのスキーマを更新します。更新するテーブルがデフォルト以外のプロジェクトにある場合は、
PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。bq update PROJECT_ID:DATASET.TABLE SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシンに書き込まれるスキーマ定義ファイル。
たとえば、次のコマンドを入力すると、デフォルト プロジェクトにある
mydataset.mytable
のスキーマ定義が更新されます。ローカルマシン上にあるスキーマ ファイルへのパスは/tmp/myschema.json
です。bq update mydataset.mytable /tmp/myschema.json
API
tables.patch
メソッドを呼び出して、schema
プロパティを使用して空の列をスキーマ定義に追加します。tables.update
メソッドはテーブル リソース全体を置き換えるため、tables.patch
メソッドの方が適切です。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
新しい SchemaField オブジェクトを Table.schema のコピーに付加し、Table.schema プロパティの値を更新後のスキーマで置き換えます。ネストされた列を RECORD
列に追加する
新しい列をテーブルのスキーマに追加するだけでなく、ネストされた列を RECORD
列に追加することもできます。ネストされた列を追加する方法は、新しい列を追加する場合と非常によく似ています。
コンソール
ネストされた新しいフィールドを既存の RECORD
列に追加することは、Google Cloud コンソールではサポートされていません。
SQL
SQL DDL ステートメントを使用して新しくネストされたフィールドを既存の RECORD
列に追加できません。
bq
bq update
コマンドを発行して、ネストされたフィールドを既存の RECORD
列のスキーマ定義に追加する JSON スキーマ ファイルを指定します。更新するテーブルがデフォルト以外のプロジェクトにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。
bq update PROJECT_ID:DATASET.TABLE SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシン上の JSON スキーマ ファイルへのパス
インライン スキーマを指定する場合は、列の説明、モード、RECORD
(STRUCT
)型を指定することはできません。すべての列モードはデフォルトで NULLABLE
になります。そのため、ネストされた新しい列を RECORD
に追加する場合は、JSON スキーマ ファイルを指定する必要があります。
JSON スキーマ ファイルを使用して、ネストされた列を RECORD
に追加するには:
まず、
--schema
フラグを指定したbq show
コマンドを発行して、既存のテーブル スキーマをファイルに書き込みます。更新するテーブルがデフォルト以外のプロジェクトにある場合は、PROJECT_ID:DATASET.TABLE
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシンに書き込まれるスキーマ定義ファイル。
たとえば、
mydataset.mytable
のスキーマ定義をファイルに書き込むには、次のコマンドを入力します。mydataset.mytable
はデフォルト プロジェクトにあります。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
スキーマ ファイルをテキスト エディタで開きます。スキーマは次のようになっています。この例では、
column3
はネストされた繰り返し列です。ネストされた列はnested1
とnested2
です。fields
配列には、column3
内にネストされたフィールドが入ります。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "fields": [ { "mode": "NULLABLE", "name": "nested1", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested2", "type": "STRING" } ], "mode": "REPEATED", "name": "column3", "type": "RECORD" } ]
新しくネストされた列を
fields
配列の末尾に追加します。この例では、nested3
が新しくネストされた列です。[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "fields": [ { "mode": "NULLABLE", "name": "nested1", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested2", "type": "STRING" }, { "mode": "NULLABLE", "name": "nested3", "type": "STRING" } ], "mode": "REPEATED", "name": "column3", "type": "RECORD" } ]
JSON スキーマ ファイルの操作の詳細については、JSON スキーマ ファイルの指定をご覧ください。
スキーマ ファイルを更新したら、次のコマンドを発行してテーブルのスキーマを更新します。更新するテーブルがデフォルト以外のプロジェクトにある場合は、
PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。bq update PROJECT_ID:DATASET.TABLE SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシン上の JSON スキーマ ファイルへのパス
たとえば、次のコマンドを入力すると、デフォルト プロジェクトにある
mydataset.mytable
のスキーマ定義が更新されます。ローカルマシン上にあるスキーマ ファイルへのパスは/tmp/myschema.json
です。bq update mydataset.mytable /tmp/myschema.json
API
tables.patch
メソッドを呼び出して、schema
プロパティを使用してネストされた列をスキーマ定義に追加します。tables.update
メソッドはテーブル リソース全体を置き換えるため、tables.patch
メソッドの方が適切です。
データを上書きまたは追記するときの列の追加
既存のテーブルにデータを読み込んで上書きする際、そのテーブルに新しい列を追加できます。上書きする既存のテーブルのスキーマは、読み込んでいるデータのスキーマを使用して上書きされます。読み込みジョブを使用してテーブルを上書きする方法については、データの形式に関するドキュメントをご覧ください。
読み込み追加ジョブで列を追加する
読み込みジョブでデータをテーブルに追加するときに、テーブルに列を追加できます。新しいスキーマは、次のいずれかによって決まります。
- 自動検出(CSV ファイルと JSON ファイルの場合)
- JSON スキーマ ファイル(CSV ファイルおよび JSON ファイル用)で指定されたスキーマ
- Avro、ORC、Parquet、Datastore エクスポート ファイルの自己記述型ソースデータ
JSON ファイルでスキーマを指定する場合は、その中で新しい列を定義する必要があります。新しい列定義がない場合、データを追記しようとするとエラーが返されます。
追記オペレーション中に新しい列を追加する場合、既存の行の新しい列の値は NULL
に設定されます。
読み込みジョブ中にテーブルにデータを追記するときに新しい列を追加するには、次のいずれかのオプションを使用します。
bq
bq load
コマンドを使用してデータを読み込み、--noreplace
フラグを指定して、データを既存のテーブルに追記していることを示します。
付加するデータが CSV 形式または改行区切りの JSON 形式である場合は、--autodetect
フラグを指定してスキーマの自動検出を使用するか、JSON スキーマ ファイルでスキーマを指定します。追加された列は、Avro または Datastore エクスポート ファイルから自動的に推定されます。
--schema_update_option
フラグを ALLOW_FIELD_ADDITION
に設定して、追記しているデータに新しい列が含まれていることを示します。
追記するテーブルがデフォルト以外のプロジェクトのデータセットにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。
(省略可)--location
フラグを指定して、その値をロケーションに設定します。
load
コマンドを次のように入力します。
bq --location=LOCATION load \ --noreplace \ --autodetect \ --schema_update_option=ALLOW_FIELD_ADDITION \ --source_format=FORMAT \ PROJECT_ID:DATASET.TABLE \ PATH_TO_SOURCE \ SCHEMA
次のように置き換えます。
LOCATION
: ロケーションの名前。--location
フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値をasia-northeast1
に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。FORMAT
: スキーマの形式。NEWLINE_DELIMITED_JSON
、CSV
、AVRO
、PARQUET
、ORC
、DATASTORE_BACKUP
。PROJECT_ID
: プロジェクト ID。DATASET
: テーブルを含むデータセットの名前。TABLE
: 追記するテーブルの名前。PATH_TO_SOURCE
: 完全修飾の Cloud Storage URI、URI のカンマ区切りのリスト、またはローカルマシン上のデータファイルのパス。SCHEMA
: ローカルの JSON スキーマ ファイルのパス。--autodetect
を指定していない場合、スキーマ ファイルは CSV ファイルおよび JSON ファイルに対してのみ必要です。Avro と Datastore のスキーマはソースデータから推定されます。
例:
次のコマンドを入力して、ローカル Avro データファイル /tmp/mydata.avro
を mydataset.mytable
に、読み込みジョブを使用して追記します。スキーマは Avro データから自動的に推定できるため、--autodetect
フラグを使用する必要はありません。mydataset
はデフォルト プロジェクトにあります。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=AVRO \
mydataset.mytable \
/tmp/mydata.avro
次のコマンドを入力して、Cloud Storage の改行区切りの JSON データファイルを mydataset.mytable
に、読み込みジョブを使用して追記します。--autodetect
フラグは、新しい列を検出するために使用します。mydataset
はデフォルト プロジェクトにあります。
bq load \
--noreplace \
--autodetect \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json
次のコマンドを入力して、Cloud Storage の改行区切りの JSON データファイルを mydataset.mytable
に、読み込みジョブを使用して追記します。新しい列を含むスキーマは、ローカルの JSON スキーマ ファイル /tmp/myschema.json
で定義されています。mydataset
はデフォルト プロジェクトではなく myotherproject
にあります。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_ADDITION \
--source_format=NEWLINE_DELIMITED_JSON \
myotherproject:mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json
API
jobs.insert
メソッドを呼び出します。load
ジョブを構成し、次のプロパティを設定します。
sourceUris
プロパティを使用して、Cloud Storage 内のデータを参照します。sourceFormat
プロパティを設定して、データ形式を指定します。schema
プロパティでスキーマを指定します。schemaUpdateOptions
プロパティを使用して、スキーマ更新オプションを指定します。writeDisposition
プロパティを使用して、宛先テーブルの書き込み処理をWRITE_APPEND
に設定します。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
クエリ追加ジョブで列を追加する
クエリ結果をテーブルに追加するときに、テーブルに列を追加できます。
クエリジョブで追記オペレーションを使用して列を追加すると、クエリ結果のスキーマが使用されて宛先テーブルのスキーマが更新されます。ある場所のテーブルにクエリを実行して、別の場所のテーブルに結果を書き込むことはできません。
クエリジョブ中にテーブルにデータを追加する際に新しい列を追加するには、次のいずれかのオプションを選択します。
bq
bq query
コマンドを使用してデータに対するクエリを実行し、--destination_table
フラグを指定してどのテーブルを追記しているかを示します。
クエリ結果を既存の宛先テーブルに追記していることを指定するには、--append_table
フラグを指定します。
--schema_update_option
フラグを ALLOW_FIELD_ADDITION
に設定して、追記しているクエリ結果に新しい列が含まれていることを示します。
クエリに GoogleSQL 構文を使用するには、use_legacy_sql=false
フラグを指定します。
追記するテーブルがデフォルト以外のプロジェクトのデータセットにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。クエリを実行するテーブルと宛先テーブルは同じ場所にある必要があります。
(省略可)--location
フラグを指定して、その値をロケーションに設定します。
bq --location=LOCATION query \ --destination_table PROJECT_ID:DATASET.TABLE \ --append_table \ --schema_update_option=ALLOW_FIELD_ADDITION \ --use_legacy_sql=false \ 'QUERY'
次のように置き換えます。
LOCATION
: ロケーションの名前。--location
フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値をasia-northeast1
に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。クエリ結果は、別のロケーションのテーブルに追記できません。PROJECT_ID
: プロジェクト ID。dataset
: 追記するテーブルを含むデータセットの名前。TABLE
: 追記するテーブルの名前。QUERY
: GoogleSQL 構文のクエリ。
例:
次のコマンドを入力して、デフォルト プロジェクトで mydataset.mytable
のクエリを実行したり、クエリ結果をmydataset.mytable2
に (デフォルト プロジェクトでも同様)追記したりできます。
bq query \
--destination_table mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
次のコマンドを入力して、デフォルト プロジェクトで mydataset.mytable
のクエリを実行できます。また、クエリ結果を myotherproject
の mydataset.mytable2
に追記することもできます。
bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_ADDITION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
API
jobs.insert
メソッドを呼び出します。query
ジョブを構成し、次のプロパティを設定します。
destinationTable
プロパティを使用して宛先テーブルを指定します。writeDisposition
プロパティを使用して、宛先テーブルの書き込み処理をWRITE_APPEND
に設定します。schemaUpdateOptions
プロパティを使用して、スキーマ更新オプションを指定します。query
プロパティを使用して GoogleSQL クエリを指定します。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
列の名前を変更する
テーブルの列の名前を変更するには、ALTER TABLE RENAME COLUMN
DDL ステートメントを使用します。次の例では、mytable
の列 old_name
の名前を new_name
に変更します。
ALTER TABLE mydataset.mytable RENAME COLUMN old_name TO new_name;
ALTER TABLE RENAME COLUMN
ステートメントの詳細については、DDL の詳細をご覧ください。
列のデータ型を変更する
Google Cloud コンソール、bq コマンドライン ツール、BigQuery API では列のデータ型を変更できません。列の新しいデータ型を指定するスキーマを適用してテーブルを更新しようとすると、次のようなエラーが返されます。
DDL ステートメントを使用して列のデータ型を変更する
GoogleSQL を使用して、列のデータ型に特定の変更を加えることができます。サポートされているデータ型の変換の詳細と完全なリストについては、ALTER COLUMN SET DATA TYPE
DDL ステートメントをご覧ください。
次の例では、INT64
型の列を持つテーブルを作成してから、型を NUMERIC
に更新します。
CREATE TABLE mydataset.mytable(c1 INT64); ALTER TABLE mydataset.mytable ALTER COLUMN c1 SET DATA TYPE NUMERIC;
次の例では、2 つのフィールドにネストされた列が配置されているテーブルを作成し、一方の列の型を INT
から NUMERIC
に更新しています。
CREATE TABLE mydataset.mytable(s1 STRUCT<a INT64, b STRING>); ALTER TABLE mydataset.mytable ALTER COLUMN s1 SET DATA TYPE STRUCT<a NUMERIC, b STRING>;
列のデータ型をキャストする
列のデータ型をキャスト可能型に変更するには、SQL クエリを使用してテーブルデータを選択し、関連する列のキャストを行い、テーブルを上書きします。テーブル全体のスキャンが必要になるため、非常に大きなテーブルではキャストと上書きはおすすめしません。
次の例は、mydataset.mytable
の column_two
と column_three
のすべてのデータを選択し、column_one
を DATE
から STRING
にキャストする SQL クエリを示しています。クエリ結果を使用して、既存のテーブルを上書きします。上書きされたテーブルには、column_one
が STRING
データ型として保存されます。
CAST
を使用したときに、BigQuery がキャストできない場合はクエリが失敗します。GoogleSQL でのキャストルールの詳細については、キャスティングをご覧ください。
コンソール
Google Cloud コンソールで [BigQuery] ページに移動します。
[クエリエディタ] で次のクエリを入力して、
mydataset.mytable
のcolumn_two
とcolumn_three
のすべてのデータが選択され、column_one
がDATE
からSTRING
にキャストされるようにします。クエリでは、エイリアスを使用してcolumn_one
を同じ名前でキャストします。mydataset.mytable
はデフォルト プロジェクトにあります。SELECT column_two, column_three, CAST(column_one AS STRING) AS column_one FROM mydataset.mytable;
[展開] をクリックして、[クエリの設定] を選択します。
[送信先] セクションで、次の操作を行います。
[クエリ結果の宛先テーブルを設定する] を選択します。
[プロジェクト名] の値は、デフォルトのプロジェクトのままにします。これは
mydataset.mytable
を含むプロジェクトです。[データセット] で [
mydataset
] を選択します。[テーブル ID] フィールドに「
mytable
」と入力します。[宛先テーブルの書き込み設定] で、[テーブルを上書きする] を選択します。これにより、クエリ結果を使用して
mytable
が上書きされます。
必要に応じて、データの [ロケーション] を選択します。
設定を更新するには、[保存] をクリックします。
[
実行] をクリックします。クエリジョブが完了すると、
column_one
のデータ型はSTRING
になります。
bq
次の bq query
コマンドを入力して、mydataset.mytable
の column_two
と column_three
のすべてのデータが選択され、column_one
が DATE
から STRING
にキャストされるようにします。クエリでは、エイリアスを使用して column_one
を同じ名前でキャストします。mydataset.mytable
はデフォルト プロジェクトにあります。
--destination_table
フラグを使用してクエリ結果を mydataset.mytable
に書き込み、--replace
フラグを使用して mytable
を上書きします。GoogleSQL 構文を使用するには、use_legacy_sql=false
フラグを指定します。
必要に応じて、--location
フラグを指定して、その値をロケーションに設定します。
bq query \
--destination_table mydataset.mytable \
--replace \
--use_legacy_sql=false \
'SELECT
column_two,
column_three,
CAST(column_one AS STRING) AS column_one
FROM
mydataset.mytable'
API
mydataset.mytable
の column_two
と column_three
のすべてのデータを選択し、column_one
を DATE
から STRING
にキャストするには、jobs.insert
メソッドを呼び出して query
ジョブを構成します。(省略可)jobReference
セクションにある location
プロパティでロケーションを指定します。
クエリジョブで使用される SQL クエリは、SELECT column_two,
column_three, CAST(column_one AS STRING) AS column_one FROM
mydataset.mytable
のようになります。クエリでは、エイリアスを使用して column_one
を同じ名前でキャストします。
mytable
をクエリ結果で上書きするには、configuration.query.destinationTable
プロパティに mydataset.mytable
を含め、configuration.query.writeDisposition
プロパティに WRITE_TRUNCATE
を指定します。
列のモードを変更する
現在、列のモードに対してサポートされている唯一の変更は、REQUIRED
から NULLABLE
に変更することです。列のモードを REQUIRED
から NULLABLE
に変更することは、列緩和とも呼ばれます。データを読み込んで既存のテーブルを上書きするときや、既存のテーブルにデータを追加するときにも、列を緩和できます。列のモードを NULLABLE
から REQUIRED
に変更することはできません。
既存のテーブルに列 NULLABLE
を作成する
列のモードを REQUIRED
から NULLABLE
に変更するには、次のいずれかのオプションを選択します。
コンソール
[BigQuery] ページに移動します。
[エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。
詳細パネルで [スキーマ] タブをクリックします。
[スキーマを編集] をクリックします。このボタンを表示するには、スクロールが必要な場合があります。
[現在のスキーマ] ページで、変更するフィールドを特定します。
そのフィールドの [モード] プルダウン リストで、
NULLABLE
を選択します。設定を更新するには、[保存] をクリックします。
SQL
ALTER COLUMN DROP NOT NULL
DDL ステートメントを使用します。次の例では、列 mycolumn
のモードを REQUIRED
から NULLABLE
に変更します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
ALTER TABLE mydataset.mytable ALTER COLUMN mycolumn DROP NOT NULL;
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
bq
まず、
--schema
フラグを指定したbq show
コマンドを発行して、既存のテーブル スキーマをファイルに書き込みます。更新するテーブルがデフォルト以外のプロジェクトにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --schema \ --format=prettyjson \ PROJECT_ID:DATASET.TABLE > SCHEMA_FILE
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA_FILE
: ローカルマシンに書き込まれるスキーマ定義ファイル。
たとえば、
mydataset.mytable
のスキーマ定義をファイルに書き込むには、次のコマンドを入力します。mydataset.mytable
はデフォルト プロジェクトにあります。bq show \ --schema \ --format=prettyjson \ mydataset.mytable > /tmp/myschema.json
スキーマ ファイルをテキスト エディタで開きます。スキーマは次のようになっています。
[ { "mode": "REQUIRED", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
既存の列のモードを
REQUIRED
からNULLABLE
に変更します。この例では、column1
のモードを緩和しています。[ { "mode": "NULLABLE", "name": "column1", "type": "STRING" }, { "mode": "REQUIRED", "name": "column2", "type": "FLOAT" }, { "mode": "REPEATED", "name": "column3", "type": "STRING" } ]
JSON スキーマ ファイルの操作の詳細については、JSON スキーマ ファイルの指定をご覧ください。
スキーマ ファイルを更新したら、次のコマンドを発行してテーブルのスキーマを更新します。更新するテーブルがデフォルト以外のプロジェクトにある場合は、
PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。bq update PROJECT_ID:DATASET.TABLE SCHEMA
次のように置き換えます。
PROJECT_ID
: プロジェクト ID。DATASET
: 更新するテーブルを含むデータセットの名前。TABLE
: 更新するテーブルの名前。SCHEMA
: ローカルマシン上の JSON スキーマ ファイルへのパス
たとえば、次のコマンドを入力すると、デフォルト プロジェクトにある
mydataset.mytable
のスキーマ定義が更新されます。ローカルマシン上にあるスキーマ ファイルへのパスは/tmp/myschema.json
です。bq update mydataset.mytable /tmp/myschema.json
API
tables.patch
を呼び出し、schema
プロパティを使用してスキーマ定義の中の REQUIRED
列を NULLABLE
に変更します。tables.update
メソッドはテーブル リソース全体を置き換えるため、tables.patch
メソッドの方が適切です。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
mode プロパティを'NULLABLE'
に設定した SchemaField オブジェクトのリストで、Table.schema プロパティを上書きします。
追記の読み込みジョブを使用して列を NULLABLE
にする
読み込みジョブでテーブルにデータを追記するときに、列のモードを緩和できます。ファイルの種類に応じて、次のいずれかを選択します。
- CSV ファイルと JSON ファイルのデータを追加するときに、JSON スキーマ ファイルを指定して個々の列のモードを緩和します。
- Avro、ORC、Parquet のファイルからデータを追記するときは、スキーマ内の
NULL
に列を緩和し、緩和された列がスキーマ推論によって検出されるようにします。
読み込みジョブ中にテーブルにデータを追記する際に列を REQUIRED
から NULLABLE
に緩和するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールで列のモードを緩和することはできません。
bq
bq load
コマンドを使用してデータを読み込み、--noreplace
フラグを指定して、データを既存のテーブルに追記していることを示します。
追記するデータが CSV 形式または改行区切りの JSON 形式である場合は、ローカル JSON スキーマ ファイルで緩和した列を指定します。あるいは、緩和した列がソースデータ内で検出されるように、--autodetect
フラグでスキーマの検出を使用します。
Avro、ORC、Parquet ファイルから読み込む場合、緩和した列は自動的に推定されます。列緩和は、Datastore エクスポートの追記には適用されません。Datastore エクスポート ファイルの読み込みによって作成されたテーブル内の列は常に NULLABLE
です。
--schema_update_option
フラグを ALLOW_FIELD_RELAXATION
に設定して、追記しているデータに緩和した列が含まれていることを示します。
追記するテーブルがデフォルト以外のプロジェクトのデータセットにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。
(省略可)--location
フラグを指定して、その値をロケーションに設定します。
load
コマンドを次のように入力します。
bq --location=LOCATION load \ --noreplace \ --schema_update_option=ALLOW_FIELD_RELAXATION \ --source_format=FORMAT \ PROJECT_ID:DATASET.TABLE \ PATH_TO_SOURCE \ SCHEMA
次のように置き換えます。
LOCATION
: ロケーションの名前。--location
フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値をasia-northeast1
に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。FORMAT
:NEWLINE_DELIMITED_JSON
、CSV
、PARQUET
、ORC
、AVRO
。DATASTORE_BACKUP
ファイルでは列緩和は必要ありません。Datastore エクスポート ファイルから作成されたテーブルの列は常にNULLABLE
です。PROJECT_ID
: プロジェクト ID。dataset は、テーブルを含むデータセットの名前です。
TABLE
: 追記するテーブルの名前。PATH_TO_SOURCE
: 完全修飾の Cloud Storage URI、URI のカンマ区切りのリスト、またはローカルマシン上のデータファイルのパス。SCHEMA
: ローカルの JSON スキーマ ファイルのパス。このオプションは、CSV ファイルと JSON ファイルに対してのみ使用します。Avro ファイルから読み込まれたデータでは、緩和した列は自動的に推定されます。
例:
次のコマンドを入力して、ローカル Avro データファイル /tmp/mydata.avro
を mydataset.mytable
に、読み込みジョブを使用して追記します。緩和された列は Avro データから自動的に推定できるため、スキーマ ファイルを指定する必要はありません。mydataset
はデフォルト プロジェクトにあります。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=AVRO \
mydataset.mytable \
/tmp/mydata.avro
次のコマンドを入力して、Cloud Storage の改行区切りの JSON ファイルのデータを mydataset.mytable
に、読み込みジョブを使用して追記します。緩和された列を含むスキーマは、ローカル JSON スキーマ ファイル /tmp/myschema.json
内にあります。mydataset
はデフォルト プロジェクトにあります。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=NEWLINE_DELIMITED_JSON \
mydataset.mytable \
gs://mybucket/mydata.json \
/tmp/myschema.json
次のコマンドを入力して、ローカルマシン上の CSV ファイルのデータを mydataset.mytable
に、読み込みジョブを使用して追記します。このコマンドは、スキーマの自動検出機能を使用して、ソースデータ内の緩和した列を検出します。mydataset
はデフォルト プロジェクトではなく myotherproject
にあります。
bq load \
--noreplace \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--source_format=CSV \
--autodetect \
myotherproject:mydataset.mytable \
mydata.csv
API
jobs.insert
メソッドを呼び出します。load
ジョブを構成し、次のプロパティを設定します。
sourceUris
プロパティを使用して、Cloud Storage 内のデータを参照します。sourceFormat
プロパティを設定して、データ形式を指定します。schema
プロパティでスキーマを指定します。schemaUpdateOptions
プロパティを使用して、スキーマ更新オプションを指定します。writeDisposition
プロパティを使用して、宛先テーブルの書き込み処理をWRITE_APPEND
に設定します。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
追加ジョブですべての列を NULLABLE
にする
クエリ結果をテーブルに追加するときに、そのテーブル内のすべての列を緩和できます。--schema_update_option
フラグを ALLOW_FIELD_RELAXATION
に設定すると、宛先テーブル内のすべての必須フィールドを緩和できます。クエリ追記を使用して宛先テーブル内の個々の列を緩和することはできません。読み込み追加ジョブで個々の列を緩和するには、追加ジョブで列を NULLABLE
にするをご覧ください。
宛先テーブルにクエリ結果を追記するときにすべての列を緩和するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールで列のモードを緩和することはできません。
bq
bq query
コマンドを使用してデータに対するクエリを実行し、--destination_table
フラグを指定してどのテーブルを追記しているかを示します。
クエリ結果を既存の宛先テーブルに追記していることを指定するには、--append_table
フラグを指定します。
--schema_update_option
フラグを ALLOW_FIELD_RELAXATION
に設定して、追記しているテーブル内のすべての REQUIRED
列を NULLABLE
に変更するように指示します。
クエリに GoogleSQL 構文を使用するには、use_legacy_sql=false
フラグを指定します。
追記するテーブルがデフォルト以外のプロジェクトのデータセットにある場合は、PROJECT_ID:DATASET
の形式でプロジェクト ID をデータセット名に追加します。
(省略可)--location
フラグを指定して、その値をロケーションに設定します。
bq --location=LOCATION query \ --destination_table PROJECT_ID:DATASET.TABLE \ --append_table \ --schema_update_option=ALLOW_FIELD_RELAXATION \ --use_legacy_sql=false \ 'QUERY'
次のように置き換えます。
LOCATION
: ロケーションの名前。--location
フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値をasia-northeast1
に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。PROJECT_ID
: プロジェクト ID。DATASET
: 追記するテーブルを含むデータセットの名前。TABLE
: 追記するテーブルの名前。QUERY
: GoogleSQL 構文のクエリ。
例:
次のコマンドを入力して、デフォルト プロジェクトで mydataset.mytable
のクエリを実行し、クエリ結果を mydataset.mytable2
(およびデフォルト プロジェクト)に追記します。このコマンドは、宛先テーブル内のすべての REQUIRED
列を NULLABLE
に変更します。
bq query \
--destination_table mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
次のコマンドを入力して、デフォルト プロジェクトで mydataset.mytable
のクエリを実行でき、クエリ結果を myotherproject
の mydataset.mytable2
に追記できます。このコマンドは、宛先テーブル内のすべての REQUIRED
列を NULLABLE
に変更します。
bq query \
--destination_table myotherproject:mydataset.mytable2 \
--append_table \
--schema_update_option=ALLOW_FIELD_RELAXATION \
--use_legacy_sql=false \
'SELECT
column1,column2
FROM
mydataset.mytable'
API
jobs.insert
メソッドを呼び出します。query
ジョブを構成し、次のプロパティを設定します。
destinationTable
プロパティを使用して宛先テーブルを指定します。writeDisposition
プロパティを使用して、宛先テーブルの書き込み処理をWRITE_APPEND
に設定します。schemaUpdateOptions
プロパティを使用して、スキーマ更新オプションを指定します。query
プロパティを使用して GoogleSQL クエリを指定します。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
列のデフォルト値を変更する
列のデフォルト値を変更するには、次のいずれかのオプションを選択します。
コンソール
Google Cloud コンソールで [BigQuery] ページに移動します。
[エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。
詳細パネルで [スキーマ] タブをクリックします。
[スキーマを編集] をクリックします。このボタンを表示するには、スクロールが必要な場合があります。
[現在のスキーマ] ページで、変更するトップレベル フィールドを見つけます。
そのフィールドのデフォルト値を入力します。
[保存] をクリックします。
SQL
ALTER COLUMN SET DEFAULT
DDL ステートメントを使用します。
Google Cloud コンソールで [BigQuery] ページに移動します。
クエリエディタで次のステートメントを入力します。
ALTER TABLE mydataset.mytable ALTER COLUMN column_name SET DEFAULT default_expression;
[
実行] をクリックします。
クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。
列を削除する
既存のテーブルから列を削除するには、ALTER TABLE DROP COLUMN
DDL ステートメントを使用します。
このステートメントは、削除された列に関連付けられているストレージをすぐには解放しません。ストレージに関する列を削除するときにストレージが受ける影響については、ALTER TABLE DROP COLUMN
ステートメントの詳細をご覧ください。ストレージをすぐに再利用するには、次の 2 つの方法があります。
SELECT * EXCEPT
クエリを使用してテーブルを上書きします。- データを Cloud Storage にエクスポートし、不要な列を削除してから、正しいスキーマを持つ新しいテーブルにデータを読み込みます。