分割テーブルの管理

このドキュメントでは、BigQuery で分割テーブルを管理する方法について説明します。取り込み時間分割テーブルと分割テーブルはどちらも同じ方法で管理されます。分割テーブルでは、以下の管理タスクを実行できます。

  • 時間分割テーブルに関する以下の情報を更新する
    • 説明
    • テーブルの有効期限
    • パーティションの有効期限
    • パーティション フィルタの要件
    • スキーマ定義
    • ラベル
  • 時間分割テーブルの名前を変更する(テーブルをコピーする)
  • 時間分割テーブルをコピーする
  • パーティションをコピーする
  • 時間分割テーブルを削除する
  • 時間分割テーブルのパーティションを削除する

テーブル情報の取得、テーブルの一覧表示、テーブルデータに対するアクセス権の制御など、パーティション分割テーブルの作成方法と使用方法の詳細については、取り込み時間パーティション分割テーブルの作成と使用またはパーティション分割テーブルの作成と使用をご覧ください。

分割テーブルのプロパティの更新

分割テーブルの以下の情報を更新できます。

  • 説明
  • テーブルの有効期限
  • パーティションの有効期限
  • スキーマ定義
  • ラベル

必要な権限

テーブル プロパティを更新するには、少なくとも bigquery.tables.update 権限と bigquery.tables.get 権限が必要です。次の定義済みの Cloud IAM の役割には、bigquery.tables.update 権限と bigquery.tables.get 権限が含まれています。

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

また、bigquery.datasets.create 権限があるユーザーがデータセットを作成すると、作成したデータセットに対する bigquery.dataOwner アクセス権がそのユーザーに付与されます。 bigquery.dataOwner アクセス権により、ユーザーはそのデータセット内のテーブルに関するプロパティを更新できます。

BigQuery での Cloud IAM 役割と権限については、事前定義された役割と権限をご覧ください。

パーティション分割テーブルの説明の更新

分割テーブルの説明を更新するプロセスは、標準テーブルの説明を更新するプロセスと同じです。テーブルの説明を追加または変更する方法については、テーブルの説明の更新をご覧ください。

現時点では、個々のパーティションの説明を作成することはできません。

テーブルの有効期限の更新

分割テーブルの有効期限を更新するプロセスは、標準テーブルの有効期限を更新するプロセスと同じです。テーブルの有効期限を追加または変更する方法については、テーブルの有効期限の更新をご覧ください。

パーティションの有効期限の更新

テーブルの作成時に、パーティション分割テーブルのパーティションの有効期限を指定できます。

  • DDL ALTER TABLE ステートメントの使用
  • コマンドライン ツールの bq mk コマンドの使用
  • tables.insert API メソッドの呼び出し
  • クライアント ライブラリの使用

現在、GCP Console と従来の BigQuery ウェブ UI ではパーティションの有効期限の指定がサポートされていません。

テーブルの作成時にパーティションの有効期限を指定すると、指定したパーティションの有効期限で、データセット レベルでのデフォルトのパーティション有効期限がオーバーライドされます。テーブルレベルで設定したパーティションの有効期限は、すべてのパーティションに適用されます。個々のパーティションに異なる有効期限を適用することはできません。

テーブルが作成された後はいつでも、CLI の bq update コマンドまたは API の tables.patch メソッドを使用して、テーブルのパーティションの有効期限を更新できます。現在、GCP Console および従来の BigQuery ウェブ UI では、パーティションの有効期限の更新はサポートされていません。ただし、どちらの UI でも、DDL ステートメントを使用すればパーティションの有効期限を更新できます。

テーブルのパーティション有効期限を更新すると、パーティションの作成時点に関係なく、すべてのパーティションに同じ設定が適用されます。

テーブルのパーティション有効期限を更新する際は、パーティションの日付に基づいて UTC の午前 0 時からパーティションの有効期限を計算する必要があります。

分割テーブルにもテーブル有効期限が構成されている場合は、テーブルとテーブル内のすべてのパーティションがテーブル有効期限の設定に従って削除されます。テーブルの有効期限の方がパーティションの有効期限よりも優先されます。

たとえば、分割テーブルの有効期限が 5 日、パーティションの有効期限が 7 日に設定されている場合、テーブルとテーブル内のすべてのパーティションは 5 日後に削除されます。

2016 年 12 月 13 日よりも前に作成された分割テーブルを使用しているプロジェクトの場合、パーティションの有効期限はパーティションの最終更新日で決まります。この規則は、同じプロジェクトに作成された新しいテーブルにも適用されます。プロジェクトを新しい規則に移行するには、BigQuery 公開バグトラッカーでリクエストを送信してください。

パーティション分割テーブルのパーティションの有効期限を更新するには:

DDL

データ定義言語(DDL)ステートメントを使用すると、標準 SQL クエリ構文を使用してテーブルとビューを作成および変更できます。

データ定義言語ステートメントの使用をご覧ください。

DDL ステートメントを使用してパーティション分割テーブルのパーティションの有効期限を更新するには:

  1. GCP Console で BigQuery ウェブ UI を開きます。
    GCP Console に移動する

  2. [クエリを新規作成] をクリックします。

  3. [クエリエディタ] テキスト領域に DDL ステートメントを入力します。

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       -- Sets partition expiration to 5 days
       partition_expiration_days=5
     )
     

  4. [実行] をクリックします。

CLI

bq update コマンドを --time_partitioning_expiration フラグ付きで発行します。更新するパーティション分割テーブルがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

bq update \
--time_partitioning_expiration integer \
project_id:dataset.table

ここで

  • integer は、テーブルのパーティションのデフォルトの存続期間(秒)です。最小値はありません。パーティションの日付にこの整数値を足した値が有効期限になります。0 を指定すると、パーティションの有効期限は削除され、パーティションは無期限に有効になります。有効期限のないパーティションは手動で削除する必要があります。
  • project_id はプロジェクト ID です。
  • dataset は、更新するテーブルを含むデータセットの名前です。
  • table は、更新するテーブルの名前です。

例:

mydataset.mytable にあるパーティションの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。

bq update --time_partitioning_expiration 432000 mydataset.mytable

mydataset.mytable にあるパーティションの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset はデフォルトのプロジェクトではなく myotherproject にあります。

bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable

API

tables.patch メソッドを呼び出し、timePartitioning.expirationMs プロパティを使用してパーティションの有効期限をミリ秒単位で更新します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

パーティション フィルタ要件の更新

パーティション分割テーブルを作成するときに、[パーティション フィルタを要求] オプションを有効にすると、述語フィルタの使用を要求できます。このオプションを適用した場合、WHERE 句を指定しないでパーティション分割テーブルにクエリを実行すると、次のエラーが発生します。Cannot query over table 'project_id.dataset.table' without a filter that can be used for partition elimination

パーティション分割テーブルを作成するときに [パーティション フィルタを要求] オプションを追加する方法については、パーティション分割テーブルの作成をご覧ください。

パーティション分割テーブルを作成するときに [パーティション フィルタを要求] オプションを有効にしない場合でも、テーブルを更新してオプションを追加できます。

[パーティション フィルタを要求] オプションの更新

パーティションを除外する WHERE 句を含むクエリを要求するようにパーティション分割テーブルを更新するには:

Console

パーティション分割テーブルの作成後に、GCP Console でパーティション フィルタを要求することはできません。

従来の UI

パーティション分割テーブルの作成後に、ウェブ UI を使用してパーティション フィルタを要求することはできません。

CLI

CLI を使用してパーティション フィルタを要求するようにパーティション分割テーブルを更新するには、--require_partition_filter フラグを指定して bq update コマンドを入力します。

デフォルト以外のプロジェクトでパーティション分割テーブルを更新するには、project_id:dataset の形式でプロジェクト ID をデータセットに追加します。

例:

デフォルトのプロジェクトで mydatasetmypartitionedtable を更新するには、次のコマンドを入力します。

bq update --require_partition_filter mydataset.mytable

myotherprojectmydatasetmypartitionedtable を更新するには、次のコマンドを入力します。

bq update --require_partition_filter myotherproject:mydataset.mytable

API

tables.patch メソッドを呼び出し、requirePartitionFilter プロパティを true に設定して、パーティション フィルタを要求します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

スキーマ定義の更新

分割テーブルのスキーマ定義を更新するプロセスは、標準テーブルのスキーマ定義を更新するプロセスと同じです。詳細については、テーブル スキーマの変更をご覧ください。

分割テーブルの名前の変更

現時点では、既存の分割テーブルの名前を変更することはできません。テーブル名を変更する場合は、テーブルをコピーする手順に従い、コピー オペレーションでコピー先のテーブルを指定する際に新しいテーブル名を使用します。

分割テーブルのコピー

単一の分割テーブルのコピー

単一の分割テーブルをコピーするプロセスは、単一の標準テーブルをコピーするプロセスと同じです。詳細については、テーブルのコピーをご覧ください。

分割テーブルをコピーする際は、以下の点に注意してください。

  • コピー元テーブルとコピー先テーブルは、同じロケーションにあるデータセット内に存在する必要があります。

  • パーティション分割テーブルを新しいパーティション分割テーブルにコピーする場合
    パーティション分割テーブルを新しいテーブルにコピーした場合、すべてのパーティショニング情報がテーブルとともにコピーされます。新しいテーブルが持つパーティションは古いテーブルと同じです。
  • パーティション分割されていないテーブルをパーティション分割テーブルにコピーする場合
    パーティション分割されていないテーブルをパーティション分割テーブルにコピーした場合、コピー元のデータは現在の日付に対応するパーティションにコピーされます。
  • パーティション分割テーブルを別のパーティション分割テーブルにコピーする場合
    分割テーブルを別の分割テーブルにコピーするには、コピー元テーブルとコピー先テーブルのパーティションの設定が一致している必要があります。コピー先テーブルにデータを追加するか、コピー先テーブルを上書きするかを指定できます。
  • パーティション分割テーブルをパーティション分割されていないテーブルにコピーする場合
    パーティション分割テーブルをパーティション分割されていないテーブルにコピーした場合、コピー先テーブルは分割されません。設定に応じて、パーティション分割されていないテーブルにデータが追加されるか、パーティション分割されていないテーブルが上書きされます。

複数のパーティション分割テーブルのコピー

複数の分割テーブルをコピーするプロセスは、複数の標準テーブルをコピーするプロセスと同じです。詳細については、複数のテーブルのコピーをご覧ください。

複数の分割テーブルをコピーする際は、以下の点に注意してください。

  • 同じジョブで複数のテーブルを分割テーブルにコピーする場合、コピー元に分割テーブルと分割されていないテーブルが混在していてはなりません。
  • コピー元のテーブルがすべて分割テーブルの場合、すべてのコピー元テーブルのパーティションの設定がコピー先テーブルのパーティションの設定と一致している必要があります。コピー先テーブルにデータが追加されるか、コピー先テーブルが上書きされるかは、設定によって決まります。
  • コピー元テーブルとコピー先テーブルは、同じロケーションにあるデータセット内に存在する必要があります。

パーティションのコピー

次の方法で 1 つ以上のパーティションをコピーできます。

  • コマンドライン ツールの bq cp コマンドの使用
  • jobs.insert API メソッドを呼び出して copy ジョブを構成する
  • クライアント ライブラリの使用

現在、GCP Console および従来の BigQuery ウェブ UI ではパーティションのコピーがサポートされていません。

必要な権限

テーブルとパーティションをコピーするユーザーには、少なくとも以下の権限が付与されている必要があります。

コピー元データセットに対して:

  • bigquery.tables.get
  • bigquery.tables.getData

コピー先データセットに対して:

  • bigquery.tables.create(コピー先データセットにテーブルまたはパーティションのコピーを作成するため)

bigquery.tables.createbigquery.tables.getbigquery.tables.getData の各権限は、次の事前定義された Cloud IAM 役割に含まれています。

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

また、コピージョブを実行するには、bigquery.jobs.create 権限が付与されている必要があります。

bigquery.jobs.create 権限は、以下の事前定義された Cloud IAM 役割に含まれています。

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

さらに、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。 bigquery.dataOwner アクセス権により、ユーザーはデータセット内のテーブルとパーティションをコピーできますが、コピー先のデータセットについては、同じユーザーが作成した場合を除き、アクセス権を明示的に指定する必要があります。

BigQuery での Cloud IAM 役割と権限については、事前定義された役割と権限をご覧ください。

単一のパーティションのコピー

Console

GCP Console では、パーティションのコピーはサポート対象外です。

従来の UI

従来の BigQuery ウェブ UI では、パーティションのコピーはサポート対象外です。

CLI

パーティションをコピーするには、コマンドライン ツールの bq cp(コピー)を使用し、$20160201 などのパーティション デコレータ($date)を指定します。

オプションのフラグを使用して、コピー先パーティションの書き込み処理を制御できます。

  • -a または --append_table を指定すると、コピー元パーティションのデータがコピー先データセット内の既存のテーブルまたはパーティションに追加されます。
  • -f または --force を指定すると、コピー先データセット内の既存のテーブルまたはパーティションが上書きされますが、確認を求めるプロンプトは表示されません。
  • -n または --no_clobber を指定すると、そのテーブルまたはパーティションがコピー先データセット内にすでに存在する場合、エラー メッセージ「Table 'project_id:dataset.table or table$date' already exists, skipping. 」が出力されます。If-n が指定されていない場合は、デフォルトの動作として、コピー先のテーブルやパーティションを置き換えるかどうかの選択を求めるプロンプトが表示されます。
  • --destination_kms_key は顧客管理 Cloud KMS 鍵であり、コピー先テーブルまたはパーティションの暗号化に使用されます。

cp コマンドでは --time_partitioning_field フラグと --time_partitioning_type フラグはサポートされていません。コピージョブを使用して取り込み時間分割テーブルを分割テーブルに変換することはできません。

--destination_kms_key はここでは説明しません。詳細については、Cloud KMS 鍵によるデータの保護をご覧ください。

コピー元またはコピー先のデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

(省略可)--location フラグを指定して、その値をロケーションに設定します。

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table$source_partition \
project_id:dataset.destination_table$destination_partition

ここで

  • location は、ロケーションの名前です。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • project_id は、プロジェクト ID です。
  • dataset は、コピー元またはコピー先のデータセットの名前です。
  • source_table は、コピーするテーブルです。
  • source_partition は、コピー元パーティションのパーティション デコレータです。
  • destination_table は、コピー先データセット内のテーブルの名前です。
  • destination_partition は、コピー先パーティションのパーティション デコレータです。

例:

パーティションを新しいテーブルにコピーする

次のコマンドを入力すると、2018 年 1 月 30 日のパーティションが mydataset.mytable から新しいテーブル mydataset.mytable2 にコピーされます。mydataset はデフォルト プロジェクトにあります。

bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2

パーティションをパーティション分割されていないテーブルにコピーする

mydataset.mytable にある 2018 年 1 月 30 日のパーティションを分割されていないテーブル mydataset2.mytable2 にコピーするには、次のコマンドを入力します。-a ショートカットが指定されているため、パーティションのデータは分割されていないコピー先テーブルに追加されます。データセットは両方ともデフォルト プロジェクトにあります。

bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2

mydataset.mytable にある 2018 年 1 月 30 日のパーティションを分割されていないテーブル mydataset2.mytable2 にコピーするには、次のコマンドを入力します。-f ショートカットが指定されているため、分割されていないコピー先テーブルがプロンプトなしで上書きされます。

bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2

パーティションを別のパーティション分割テーブルにコピーする

mydataset.mytable にある 2018 年 1 月 30 日のパーティションを別のパーティション分割テーブル mydataset2.mytable2 にコピーするには、次のコマンドを入力します。-a ショートカットが指定されているため、パーティションのデータはコピー先テーブルに追加されます。コピー先テーブルにはパーティション デコレータが指定されていないため、コピー元のパーティション キーが維持され、データはコピー先テーブルの 2018 年 1 月 30 日のパーティションにコピーされます。また、コピー先テーブルでパーティション デコレータを指定して、データを特定のパーティションにコピーすることもできます。mydataset はデフォルトのプロジェクトにあります。mydataset2 は、デフォルトのプロジェクトではなく、myotherproject にあります。

bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

mydataset.mytable にある 2018 年 1 月 30 日のパーティションを、別のパーティション分割テーブル mydataset2.mytable2 の 2018 年 2 月 20 日のパーティションにコピーするには、次のコマンドを入力します。-f ショートカットが指定されているため、コピー先テーブルの 2018 年 2 月 20 日のパーティションがプロンプトなしに上書きされます。パーティション デコレータを使用しないと、コピー先テーブルのすべてのデータが上書きされます。mydataset はデフォルトのプロジェクトにあります。 mydataset2 はデフォルト プロジェクトではなく myotherproject にあります。

bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180220'

mydataset.mytable にある 2018 年 1 月 30 日のパーティションを別のパーティション分割テーブル mydataset2.mytable2 にコピーするには、次のコマンドを入力します。mydataset はデフォルトのプロジェクトにあります。mydataset2 は、デフォルトのプロジェクトではなく、myotherproject にあります。コピー先テーブルにデータがある場合は、デフォルトの動作として、上書きするかどうかを確認するプロンプトが表示されます。

bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2

API

jobs.insert メソッドを呼び出し、copy ジョブを構成します。必要であれば、ジョブリソースjobReference セクションにある location プロパティでリージョンを指定します。

ジョブ構成で以下のプロパティを指定します。

  • sourceTables プロパティに、コピー元のデータセット、テーブル、パーティションを入力します。
  • destinationTable プロパティに、コピー先のデータセットとテーブルを入力します。
  • writeDisposition プロパティを使用して、コピー先のテーブルまたはパーティションにデータを追加するか上書きするかを指定します。

複数のパーティションのコピー

複数のパーティションをコピーする手順は以下のとおりです。

Console

現在、GCP Console では、パーティションのコピーはサポート対象外です。

従来の UI

現在、従来の BigQuery ウェブ UI では、パーティションのコピーはサポート対象外です。

CLI

複数のパーティションをコピーするプロセスは単一のパーティションをコピーするプロセスと同じですが、複数のコピー元パーティションをカンマ区切りのリストとして指定します。

bq cp \
'mydataset.mytable$20180130,mydataset.mytable$20180131' \
myotherproject:mydataset.mytable2

API

jobs.insert メソッドを呼び出し、copy ジョブを構成します。ジョブリソースjobReference セクションにある location プロパティでリージョンを指定します。

ジョブ構成で以下のプロパティを指定します。

  • sourceTables プロパティに、複数のコピー元パーティション(データセット名とテーブル名を含む)を入力します。
  • destinationTable プロパティに、コピー先のデータセットとテーブルを入力します。
  • writeDisposition プロパティを使用して、コピー先のテーブルまたはパーティションにデータを追加するか上書きするかを指定します。

パーティション分割テーブルの削除

時間分割テーブルとそのすべてのパーティションを削除するプロセスは、標準テーブルを削除するプロセスと同じです。テーブルの削除の詳細については、テーブルの削除をご覧ください。

分割テーブルのパーティションの削除

パーティション分割テーブルのパーティションを削除するには、コマンドライン ツールの bq rm コマンドを使用するか、tables.delete API メソッドを呼び出します。現在、従来の BigQuery ウェブ UI によるパーティションの削除はサポートされていません。

パーティション デコレータを使用すると、特定のパーティションを削除できます。たとえば、mydataset.mytable という分割テーブルにある 2016 年 3 月 1 日のパーティション($20160301)を削除するには、次のコマンドを使用します。

bq rm 'mydataset.mytable$20160301'

パーティション分割テーブル内のパーティションのリストを取得するには、取り込み時間パーティション分割テーブル内のパーティションの一覧表示またはパーティション分割テーブル内のパーティションの一覧表示をご覧ください。

現時点では、一度に削除できるパーティションは 1 つだけです。

必要な権限

パーティションを削除するには、少なくとも bigquery.tables.delete 権限と bigquery.tables.get 権限が必要です。次の定義済みの Cloud IAM の役割には、bigquery.tables.delete 権限と bigquery.tables.get 権限が含まれています。

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

また、bigquery.datasets.create 権限があるユーザーがデータセットを作成すると、作成したデータセットに対する bigquery.dataOwner アクセス権がそのユーザーに付与されます。 bigquery.dataOwner アクセス権により、ユーザーはデータセット内のテーブルとパーティションを削除できます。

BigQuery での Cloud IAM 役割と権限については、事前定義された役割と権限をご覧ください。

パーティション分割テーブル内のパーティションの削除

パーティションが 2 つある特別なパーティションではない限り、パーティションのデコレータを指定することでパーティションを削除できます。現在、__NULL__ パーティションと __UNPARTITIONED__ パーティションは削除できません。

分割テーブルのパーティションを削除する手順は以下のとおりです。

Console

GCP Console では、パーティションの削除はサポート対象外です。

従来の UI

従来の BigQuery ウェブ UI では、パーティションの削除はサポート対象外です。

CLI

bq rm コマンドで --table フラグ(または -t ショートカット)を指定し、パーティション デコレータ($date)を参照してパーティション分割テーブルの特定のパーティションを削除します。CLI を使用してパーティションを削除するときは、操作の確認を求められます。--force フラグ(または -f ショートカット)を使用すると、確認をスキップできます。

パーティション分割テーブルを含むデータセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

bq rm -f -t project_id:dataset.table$date

ここで

  • project_id は、プロジェクト ID です。
  • dataset はテーブルを含むデータセットの名前です。
  • table は、テーブルの名前です。
  • $date は、削除するパーティションのパーティション デコレータです。

例:

mydataset.mytable という分割テーブルの 2016 年 3 月 1 日のパーティション($20160301)を削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。

bq rm 'mydataset.mytable$20160301'

mydataset.mytable という分割テーブルの 2017 年 1 月 1 日のパーティション($20170101)を削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトではなく myotherproject にあります。

bq rm 'myotherproject:mydataset.mytable$20170101'

mydataset.mytable という分割テーブルの 2018 年 1 月 18 日のパーティション($20180118)を削除するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトではなく myotherproject にあります。-f ショートカットを使用して確認をスキップします。

bq rm -f 'myotherproject:mydataset.mytable$20180118'

API

tables.delete メソッドを呼び出し、tableId パラメータを使用してテーブルとパーティション デコレータを指定します。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。