分割テーブルの作成と使用

このドキュメントでは、BigQuery で分割テーブルを作成および使用する方法について説明します。取り込み時間分割テーブルについては、取り込み時間分割テーブルの作成と使用をご覧ください。

分割テーブルを作成すると、次のことができるようになります。

  • テーブルデータへのアクセスを制御する
  • 分割テーブルに関する情報を取得する
  • データセット内の分割テーブルのリストを取得する
  • メタテーブルを使用して分割テーブルのメタデータを取得する

分割テーブルのプロパティの更新、分割テーブルのコピー、分割テーブルの削除などの分割テーブルの管理の詳細については、分割テーブルの管理をご覧ください。

制限事項

分割テーブルには次の制限事項があります。

  • 分割する列は、スカラー DATE 列または TIMESTAMP 列のいずれかである必要があります。列のモードは REQUIRED または NULLABLE にできますが、REPEATED(配列ベース)にすることはできません。また、分割する列はトップレベル フィールドである必要があります。分割する列として RECORDSTRUCT)のリーフ フィールドを使用することはできません。
  • レガシー SQL を使用して、分割テーブルをクエリすることや、クエリ結果を分割テーブルに書き込むことはできません。

分割テーブルの作成

BigQuery では次のようにして分割テーブルを作成できます。

BigQuery で列ベースの時間分割テーブルを作成する場合、テーブル名はデータセット内で一意である必要があります。テーブル名の要件は次のとおりです。

  • 1,024 文字以内
  • 英字(大文字または小文字)、数字、アンダースコアだけが含まれている

必要な権限

分割テーブルを作成するユーザーには、データセット レベルで WRITER アクセス権が付与されているか、または bigquery.tables.create 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.tables.create 権限が含まれます。

また、bigquery.user 役割には bigquery.datasets.create 権限が含まれているため、bigquery.user 役割が割り当てられているユーザーは、自分が作成した任意のデータセット内に分割テーブルを作成できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーにはそのデータセットへの OWNER アクセス権が付与されます。データセットへの OWNER アクセス権により、ユーザーはそのデータセットとその中のすべてのテーブルを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

スキーマ定義を持つ空の分割テーブルの作成

スキーマ定義を持たない空の分割テーブルを作成することはできません。パーティションの作成に使用される列を識別するためには、スキーマが必要です。

スキーマ定義を持つ空の分割テーブルを作成すると、次のことができるようになります。

  • コマンドライン ツールを使用してインラインでスキーマを指定する
  • コマンドライン ツールを使用して JSON スキーマ ファイルを指定する
  • API の tables.insert メソッドを呼び出すときに、テーブル リソースでスキーマを指定する

テーブル スキーマの指定の詳細については、スキーマの指定をご覧ください。

分割テーブルを作成すると、次の操作を行えるようになります。

  • それにデータを読み込む
  • クエリの結果を書き込む
  • それにデータをコピーする

スキーマ定義を持つ空の分割テーブルを作成するには:

ウェブ UI

  1. BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. [COMPOSE QUERY] をクリックします。

  3. [New Query] テキスト領域に、CREATE TABLE DDL ステートメントを入力します。

    次のクエリでは、transaction_date DATE 列で分割されていて、パーティション有効期限が 3 日である newtable という名前のテーブルが作成されます。

     #standardSQL
     CREATE TABLE mydataset.newtable (transaction_id INT64, transaction_date DATE)
     PARTITION BY transaction_date
     OPTIONS(
       partition_expiration_days=3,
       description="a table partitioned by transaction_date"
     )

  4. [Show Options] をクリックします。

  5. [Processing Location] で [Unspecified] をクリックし、データのロケーションを選択します。データが US または EU マルチリージョン ロケーションに存在する場合、処理ロケーションを未指定のままにしておくことができます。データが US または EU に存在する場合は、処理ロケーションが自動的に検出されます。

  6. [Run query] をクリックします。クエリが完了すると、テーブルがナビゲーション ペインに表示されます。

コマンドライン

mk コマンドを使用し、--table フラグ(または -t ショートカット)、--schema フラグ、--time_partitioning_field フラグを指定します。テーブルのスキーマ定義をインラインで、または JSON スキーマ ファイルを使用して指定できます。

オプションのパラメータには --expiration--description--time_partitioning_expiration--destination_kms_key--label があります。現時点では、--time_partitioning_type でサポートされている値は DAY のみであるため、このフラグを指定する必要はありません。

デフォルト以外のプロジェクトでテーブルを作成する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

--destination_kms_key についてはここでは説明しません。このフラグの使用方法の詳細については、顧客管理の暗号鍵をご覧ください。

次のコマンドを入力して、スキーマ定義を持つ空の分割テーブルを作成します。

bq mk --table --expiration [INTEGER1] --schema [SCHEMA] --time_partitioning_field [COLUMN] --time_partitioning_expiration [INTEGER2] --description "[DESCRIPTION]" --label [KEY:VALUE, KEY:VALUE] [PROJECT_ID]:[DATASET].[TABLE]

ここで

  • [INTEGER1] はテーブルのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。時間分割テーブルの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限設定は無視されます。この値を設定すると、指定した時間が経過したときにテーブルとすべてのパーティションは削除されます。
  • [SCHEMA] は、[FIELD]:[DATA_TYPE],[FIELD]:[DATA_TYPE] の形式のインライン スキーマ定義か、ローカルマシン上の JSON スキーマ ファイルのパスです。
  • [COLUMN] は、パーティションの作成に使用される TIMESTAMP 列または DATE 列の名前です。
  • [INTEGER2] は、テーブルのパーティションのデフォルトの存続期間(秒)です。最小値はありません。パーティションの日付にこの整数値を足した値が有効期限になります。パーティションの有効期限はテーブルの有効期限とは無関係であり、それをオーバーライドしません。テーブルの有効期限より長いパーティション有効期限を設定すると、テーブルの有効期限が優先されます。
  • [DESCRIPTION] はテーブルの説明で、引用符で囲みます。
  • [KEY:VALUE] は、ラベルを表す Key-Value ペアです。カンマ区切りリストを使用して複数のラベルを入力できます。
  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] は、プロジェクトのデータセットです。
  • [TABLE] は、作成する分割テーブルの名前です。

コマンドラインでスキーマを指定する場合、RECORDSTRUCT)型と列の説明を含めることはできません。また、列のモードも指定できません。すべてのモードは、デフォルトで NULLABLE に設定されます。説明、モード、RECORD 型を含めるには、代わりに JSON スキーマ ファイルを指定します

例:

デフォルト プロジェクトにある mydataset 内に mypartitionedtable という名前の分割テーブルを作成するには、次のコマンドを入力します。パーティションの有効期限は 86,400 秒(1 日)に設定され、テーブルの有効期限は 2,592,000 秒(1 か月、つまり 30 日)に設定され、説明は This is my partitioned table に設定され、ラベルは organization:development に設定されます。このコマンドでは --table ではなく -t ショートカットを使用しています。

スキーマはインラインで ts:TIMESTAMP,column1:STRING,column2:INTEGER,coumn4:STRING と指定されています。指定された TIMESTAMP 型のフィールド ts を使用して、パーティションが作成されます。

bq mk -t --expiration 2592000 --schema 'ts:TIMESTAMP,column1:STRING,column2:INTEGER,coumn4:STRING' --time_partitioning_field ts --time_partitioning_expiration 86400  --description "This is my partitioned table" --label org:dev mydataset.mypartitionedtable

デフォルト プロジェクトではない myotherproject 内に mypartitionedtable という名前の分割テーブルを作成するには、次のコマンドを入力します。パーティションの有効期限は 259,200 秒(3 日)に設定され、説明は This is my partitioned table に設定され、ラベルは organization:development に設定されます。このコマンドでは --table ではなく -t ショートカットを使用しています。このコマンドではテーブルの有効期限を指定していません。データセットにデフォルトのテーブル有効期限がある場合、それが適用されます。データセットにデフォルトのテーブル有効期限がない場合、テーブルは期限切れになりませんが、パーティションは 3 日で期限切れになります。

スキーマは、/tmp/myschema.json というローカル JSON ファイルで定義されています。このスキーマ定義には、パーティションの作成に使用される ts という TIMESTAMP フィールドがあります。

bq mk -t --expiration 2592000 --schema /tmp/myschema.json --time_partitioning_field ts --time_partitioning_expiration 86400  --description "This is my partitioned table" --label org:dev myotherproject:mydataset.mypartitionedtable

テーブルを作成した後に、分割テーブルのテーブル有効期限パーティション有効期限説明ラベルを更新できます。

API

timePartitioning プロパティと schema プロパティを指定する定義済みテーブル リソースを使用して、tables.insert メソッドを呼び出します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

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

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('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))

クエリ結果からの分割テーブルの作成

クエリ結果から分割テーブルを作成するには、結果を新しい宛先テーブルに書き込みます。分割テーブルまたは分割されていないテーブルをクエリすることによって、分割テーブルを作成できます。クエリ結果を使用して、既存の標準テーブルを分割テーブルに変更することはできません。

クエリ結果から分割テーブルを作成する場合、標準 SQL を使用する必要があります。現時点では、分割テーブルをクエリする場合や、クエリ結果を分割テーブルに書き込む場合に、レガシー SQL はサポートされていません。

パーティション デコレータを使用すると、クエリ結果を特定のパーティションに書き込むことができます。タイムゾーンを調整するには、パーティション デコレータを使用して、希望するタイムゾーンに基づいてパーティションにデータを書き込みます。たとえば、太平洋標準時(PST)を使用している場合、対応するパーティション デコレータを使用して、2016 年 5 月 1 日 PST に生成されたすべてのデータをその日付のパーティションに書き込みます。

[TABLE_NAME]$20160501

パーティション デコレータを使用してクエリ結果を特定のパーティションに書き込む場合、パーティションに書き込まれるデータは、テーブルのパーティショニング スキームに準拠している必要があります。パーティションに書き込まれるすべての行は、パーティションの日付内に収まる値を持つ必要があります。

例:

次のクエリは、テーブル T の 2018 年 2 月 1 日のパーティションにデータを書き込みます。テーブルには、TS という名前の TIMESTAMP 列と a という名前の INT64 列の 2 つの列があります。このクエリは、タイムスタンプ 2018-02-01 をパーティション $20180201 に書き込むため、コマンドは正常に完了します。このクエリは US マルチリージョンで実行されています。

bq --location=US query --nouse_legacy_sql  --destination_table=T$20180201 'SELECT TIMESTAMP("2018-02-01") as TS, 2 as a'

次のクエリも、テーブル T にデータを書き込もうとしますが、タイムスタンプ 2018-01-31 をパーティション $20180201 に書き込んでいます。このクエリは、書き込もうとしている値がパーティションの日付内に収まらないため失敗します。

bq --location=US query --nouse_legacy_sql  --destination_table=T$20180201 'SELECT TIMESTAMP("2018-01-31") as TS, 2 as a'

分割テーブル内のデータに対する追加または修正(置換)の詳細については、分割テーブルデータに対する追加および上書きをご覧ください。分割テーブルに対するクエリの詳細については、分割テーブルのクエリをご覧ください。

ウェブ UI

BigQuery ウェブ UI を使用してデータをクエリする場合は、宛先テーブルのパーティショニング オプションを指定できません。

CLI

bq query コマンドを入力し、クエリ結果に基づいて永続テーブルを作成するために --destination_table フラグを指定し、宛先の分割テーブルを作成するために --time_partitioning_field フラグを指定します。現時点では、--time_partitioning_type でサポートされている値は DAY のみであるため、このフラグを指定する必要はありません。

標準 SQL 構文を使用するには、use_legacy_sql=false フラグを指定します。デフォルト以外のプロジェクトにあるテーブルにクエリ結果を書き込むには、[PROJECT_ID]:[DATASET] の形式でデータセット名にプロジェクト ID を追加します。

--location フラグを指定し、値を該当するロケーションに設定します。

次のコマンドを入力して、クエリ結果から宛先の新しい分割テーブルを作成します。

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

ここで

  • [LOCATION] はロケーションの名前です。データが US または EU のマルチリージョン ロケーションにある場合は、--location フラグを省略できます。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] は、新しい分割テーブルを配置するデータセットの名前です。
  • [TABLE] は、クエリ結果を使用して作成する分割テーブルの名前です。
  • [QUERY] は標準 SQL 構文のクエリです。現時点では、レガシー SQL を使用して、分割テーブルをクエリすることや、クエリ結果を分割テーブルに書き込むことはできません。

例:

次のコマンドを入力すると、mydataset 内の mypartitionedtable という分割テーブルにクエリ結果が書き込まれます。mydataset はデフォルト プロジェクトにあります。このクエリは、分割されていないテーブルである NHTSA Traffic Fatality 一般公開データセットからデータを取得します。このテーブルの timestamp_of_crash TIMESTAMP 列を使用してパーティションが作成されます。

bq --location=US query --destination_table mydataset.mypartitionedtable --time_partitioning_field timestamp_of_crash --use_legacy_sql=false 'SELECT state_number, state_name, day_of_crash, month_of_crash, year_of_crash, latitude, longitude, manner_of_collision, number_of_fatalities, timestamp_of_crash FROM `bigquery-public-data.nhtsa_traffic_fatalities.accident_2016` LIMIT 100'

次のコマンドを入力すると、mydataset 内の mypartitionedtable という分割テーブルにクエリ結果が書き込まれます。mydataset はデフォルト プロジェクトではなく myotherproject にあります。このクエリは、分割されていないテーブルである NHTSA Traffic Fatality 一般公開データセットからデータを取得します。このテーブルの timestamp_of_crash TIMESTAMP 列を使用してパーティションが作成されます。

bq --location=US query --destination_table myotherproject:mydataset.mypartitionedtable --time_partitioning_field timestamp_of_crash --use_legacy_sql=false 'SELECT state_number, state_name, day_of_crash, month_of_crash, year_of_crash, latitude, longitude, manner_of_collision, number_of_fatalities, timestamp_of_crash FROM `bigquery-public-data.nhtsa_traffic_fatalities.accident_2016` LIMIT 100'

API

クエリ結果を永続的な分割テーブルに保存するには、jobs.insert メソッドを呼び出し、query ジョブを構成して、configuration.query.destinationTable プロパティと timePartitioning.field プロパティの値を含めます。

ジョブリソースjobReference セクションにある location プロパティにロケーションを指定します。

データを読み込むときの分割テーブルの作成

新しいテーブルにデータを読み込むときにパーティショニング オプションを指定することによって、分割テーブルを作成できます。データを読み込む前に空の分割テーブルを作成しておく必要はありません。分割テーブルを作成すると同時にデータを読み込むことができます。

BigQuery にデータを読み込むときに、テーブル スキーマを指定できます。また、サポートされているデータ形式であれば、スキーマの自動検出を使用できます。

パーティション デコレータを使用してデータを特定のパーティションに読み込むことができます。タイムゾーンを調整するには、パーティション デコレータを使用し、希望するタイムゾーンに基づいてパーティションにデータを読み込みます。たとえば、太平洋標準時(PST)を使用している場合、対応するパーティション デコレータを使用して、2016 年 5 月 1 日 PST に生成されたすべてのデータをその日付のパーティションに読み込みます。

[TABLE_NAME]$20160501

パーティション デコレータを使用してデータを特定のパーティションに読み込む場合、パーティションに読み込まれるデータは、テーブルのパーティショニング スキームに準拠している必要があります。パーティションに書き込まれるすべての行は、パーティションの日付内に収まる値を持つ必要があります。

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

API

読み込みジョブを介してテーブルを作成するときにパーティショニング構成を定義するには、関連するパーティショニング構成で configuration.load.timePartitioning メッセージを使用します。時間経過で有効期限が切れるパーティションには configuration.load.timePartitioning.expirationMs を含めます。configuration.load.timePartitioning.field を使用することで、そのテーブルを疑似列とユーザーデータ列のどちらによって分割するかを管理できます。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv")
gcsRef.SkipLeadingRows = 1
gcsRef.Schema = bigquery.Schema{
	{Name: "name", Type: bigquery.StringFieldType},
	{Name: "post_abbr", Type: bigquery.StringFieldType},
	{Name: "date", Type: bigquery.DateFieldType},
}
loader := client.Dataset(destDatasetID).Table(destTableID).LoaderFrom(gcsRef)
loader.TimePartitioning = &bigquery.TimePartitioning{
	Field:      "date",
	Expiration: 90 * 24 * time.Hour,
}
loader.WriteDisposition = bigquery.WriteEmpty

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'
table_id = 'us_states_by_date'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
    bigquery.SchemaField('date', 'DATE')
]
job_config.skip_leading_rows = 1
job_config.time_partitioning = bigquery.TimePartitioning(
    type_=bigquery.TimePartitioningType.DAY,
    field='date',  # name of column to use for partitioning
    expiration_ms=7776000000)  # 90 days
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states-by-date.csv'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table(table_id),
    job_config=job_config)  # API request

assert load_job.job_type == 'load'

load_job.result()  # Waits for table load to complete.

table = client.get_table(dataset_ref.table(table_id))
print("Loaded {} rows to table {}".format(table.num_rows, table_id))

分割テーブルへのアクセスの制御

テーブルまたはパーティションにアクセス制御を直接割り当てることはできません。データセット レベルまたはプロジェクト レベルでアクセス制御を構成することにより、テーブル アクセスを制御できます。

データセット レベルのアクセス制御では、特定のデータセット内のテーブルに対してユーザー、グループ、サービス アカウントが実行できるオペレーションを指定します。データセット レベルの権限のみを割り当てる場合は、プロジェクトへのアクセス権を与える基本の役割または事前定義されたプロジェクト レベルの役割(例: bigquery.user)も割り当てる必要があります。

個々のデータセットへのアクセス権を付与する代わりに、事前定義されたプロジェクト レベルの IAM 役割を割り当てると、プロジェクトに含まれるすべてのデータセットのすべてのテーブルデータへのアクセス権を付与できます。

また、IAM カスタム役割を作成することもできます。カスタム役割を作成する場合、付与する権限は、ユーザー、グループ、サービス アカウントにどのテーブル オペレーションを許可するかによって異なります。

役割と権限の詳細については、以下をご覧ください。

分割テーブルの使用

分割テーブルに関する情報の取得

テーブルに関する情報を取得するには、BigQuery ウェブ UI または bq show CLI コマンドを使用するか、API の tables.get メソッドを呼び出します。

必要な権限

テーブルに関する情報を取得するユーザーには、データセットに対する READER 役割が割り当てられているか、プロジェクト レベルの IAM 役割のうち bigquery.tables.get 権限を含むものが割り当てられている必要があります。プロジェクト レベルで bigquery.tables.get 権限が付与されているユーザーは、そのプロジェクト内のすべてのテーブルに関する情報を取得できます。事前定義されたプロジェクト レベルの IAM 役割のうち、bigquery.userbigquery.jobUser 以外には、bigquery.tables.get 権限が含まれています。

また、bigquery.user 役割が割り当てられているユーザーには bigquery.datasets.create 権限もあります。そのため、bigquery.user 役割が割り当てられているユーザーは、自分が作成した任意のデータセット内のテーブルに関する情報を取得できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーにはそのデータセットへの OWNER アクセス権が付与されます。データセットへの OWNER アクセス権により、ユーザーはそのデータセットとその中のすべてのテーブルを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

分割テーブルの情報の取得

分割テーブルに関する情報を表示するには:

ウェブ UI

  1. ナビゲーション ペインで、データセットの左側にある下矢印アイコン 下矢印アイコン をクリックして展開するか、データセット名をダブルクリックします。これにより、データセット内のテーブルとビューが表示されます。

  2. テーブル名をクリックします。

  3. [Details] をクリックします。[Table Details] ページに、テーブルの説明とテーブル情報が表示されます。

    分割テーブルの詳細

  4. [Schema] タブをクリックすると、テーブルのスキーマ定義が表示されます。分割テーブルには _PARTITIONTIME 疑似列が含まれていないことがわかります。

コマンドライン

すべてのテーブル情報を表示するには、bq show コマンドを発行します。テーブルのスキーマ情報のみを表示するには --schema フラグを使用します。--format フラグを使用して出力を制御できます。

デフォルト以外のプロジェクトにあるテーブルの情報を取得する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

bq show --schema --format=prettyjson [PROJECT_ID]:[DATASET].[TABLE]

ここで

  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] はデータセットの名前です。
  • [TABLE] はテーブルの名前です。

例:

mydataset 内の mytable に関するすべての情報を表示するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。

bq show --format=prettyjson mydataset.mytable

mydataset 内の mytable に関するすべての情報を表示するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトではなく myotherproject にあります。

bq show --format=prettyjson myotherproject:mydataset.mytable

mydataset 内の mytable に関するスキーマ情報のみを表示するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトではなく myotherproject にあります。

bq show --schema --format=prettyjson myotherproject:mydataset.mytable

API

bigquery.tables.get メソッドを呼び出し、必要な関連パラメータを指定します。

データセット内の分割テーブルの一覧表示

データセット内のテーブル(分割テーブルを含む)を一覧表示するには、BigQuery ウェブ UI または bq ls CLI コマンドを使用するか、tables.list API メソッドを呼び出します。

必要な権限

データセット内のテーブルを一覧表示するユーザーには、データセットに対する READER 役割が割り当てられているか、bigquery.tables.list 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。プロジェクト レベルで bigquery.tables.list 権限が付与されているユーザーは、そのプロジェクトの任意のデータセット内のテーブルを一覧表示できます。事前定義されているプロジェクト レベルの IAM 役割のうち、bigquery.jobUser 以外の役割には bigquery.tables.list 権限が含まれています。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

分割テーブルの一覧表示

データセット内のテーブル(分割テーブルを含む)を一覧表示するには:

ウェブ UI

  1. ウェブ UI のナビゲーション ペインで、データセットの左側にある下矢印アイコン 下矢印アイコン をクリックして展開するか、データセット名をダブルクリックします。これにより、データセット内のテーブルとビューが表示されます。

  2. リストをスクロールして、データセット内のテーブルを表示します。テーブルとビューは別々のアイコンで識別されます。

    テーブルの表示

CLI

bq ls コマンドを発行します。--format フラグを使用して出力を制御できます。デフォルト以外のプロジェクトにあるテーブルを一覧表示する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

bq ls --format=pretty [PROJECT_ID]:[DATASET]

ここで

  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] はデータセットの名前です。

このコマンドを実行すると、Type フィールドに TABLE または VIEW が表示されます。分割テーブルの場合は、Time Partitioning フィールドに DAY、パーティションの作成に使用された列、およびパーティションの有効期限(ある場合)がミリ秒単位で表示されます。

例:

+-------------------------+-------+----------------------+---------------------------------------------------+
|         tableId         | Type  |        Labels        | Time Partitioning                                 |
+-------------------------+-------+----------------------+---------------------------------------------------+
| mytable                 | TABLE | department:shipping  |  DAY (field: source_date, expirationMs: 86400000) |
| myview                  | VIEW  |                      |                                                   |
+-------------------------+-------+----------------------+---------------------------------------------------+

例:

次のコマンドを入力すると、デフォルト プロジェクトにある mydataset データセット内のテーブルが一覧表示されます。

bq ls --format=pretty mydataset

次のコマンドを入力すると、myotherproject にある mydataset データセット内のテーブルが一覧表示されます。

bq ls --format=pretty myotherproject:mydataset

API

API を使用してテーブルを一覧表示するには、tables.list メソッドを呼び出します。

分割テーブル内のパーティションの一覧表示

分割テーブル内のパーティションを一覧表示するには、レガシー SQL を使用して __PARTITIONS_SUMMARY__ メタテーブルをクエリします。

このクエリを実行するには、BigQuery ウェブ UI を使用するか、bq query コマンドを使用するか、jobs.insert メソッドを呼び出して query ジョブを構成します。

必要な権限

__PARTITIONS_SUMMARY__ メタテーブルを使用するクエリジョブを実行するユーザーには、bigquery.jobs.create 権限が必要です。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.jobs.create 権限が含まれています。

また、ユーザーには、データセット レベルで READER 役割が付与されているか、bigquery.tables.getData 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。事前定義されているプロジェクト レベルの IAM 役割のうち、bigquery.userbigquery.jobUserbigquery.metadataViewer 以外の役割には bigquery.tables.getData 権限が含まれています。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

分割テーブル内のパーティションの一覧表示

レガシー SQL を使用して、分割テーブル内のパーティションを一覧表示できます。分割テーブル内のパーティションを一覧表示するには、次のようにします。

ウェブ UI

  1. BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動

  2. [COMPOSE QUERY] ボタンをクリックします。

  3. [New Query] ボックスに次のテキストを入力して、__PARTITIONS_SUMMARY__ メタテーブルをクエリします。

    #legacySQL
    SELECT
      partition_id
    FROM
      [[DATASET].[TABLE]$__PARTITIONS_SUMMARY__]
    

    ここで

    • [DATASET] は、テーブルが含まれているデータセットです。
    • [TABLE] はテーブルの名前です。
  4. [Show Options] をクリックします。

  5. [Processing Location] で [Unspecified] をクリックし、データのロケーションを選択します。データが US または EU マルチリージョン ロケーションに存在する場合、処理ロケーションを未指定のままにしておくことができます。データが US または EU に存在する場合は、処理ロケーションが自動的に検出されます。

  6. [Run query] をクリックします。

CLI

bq query コマンドを使用して次のクエリを入力します。

bq --location=[LOCATION] query --use_legacy_sql=true '
SELECT
  partition_id
FROM
  [[DATASET].[TABLE]$__PARTITIONS_SUMMARY__]'

Where:

  + `[LOCATION]` is the name of your location. The `--location` flag is
    optional if your data is in the `US` or the `EU` multi-region
    location. For example, if you are using BigQuery in
    the Tokyo region, set the flag's value to `asia-northeast1`. You can
    set a default value for the location using the [.bigqueryrc file](/bigquery/docs/bq-command-line-tool#setting_default_values_for_command-line_flags).
  + `[DATASET]` is the dataset that contains the table.
  + `[TABLE]` is the name of the table.

API

jobs.insert メソッドを呼び出し、テーブルの __PARTITIONS_SUMMARY__ メタテーブルをクエリする query ジョブを構成します。

ジョブリソースjobReference セクションにある location プロパティにロケーションを指定します。

メタテーブルを使用したテーブル メタデータの取得

分割テーブルに関するメタデータを取得するプロセスは、標準テーブルに関するメタデータを取得するプロセスと同じです。詳細については、メタテーブルを使用したテーブル メタデータの取得をご覧ください。

__TABLES_SUMMARY__ メタテーブルをクエリすると、すべてのテーブルが一覧表示されます。分割テーブルと分割されていないテーブルを区別する type オプションはありません。

メタテーブルを使用したパーティション メタデータの取得

__PARTITIONS_SUMMARY__ メタテーブルは、その内容が時間分割テーブル内のパーティションに関するメタデータを表す特殊なテーブルです。__PARTITIONS_SUMMARY__ メタテーブルは読み取り専用です。

時間分割テーブル内のパーティションに関するメタデータにアクセスするには、クエリの SELECT ステートメントで __PARTITIONS_SUMMARY__ メタテーブルを使用します。このクエリを実行するには、BigQuery ウェブ UI を使用するか、コマンドライン ツールの bq query コマンドを使用するか、API の jobs.insert メソッドを呼び出してクエリジョブを構成します。

現時点では、標準 SQL ではパーティション デコレータ セパレータ($)がサポートされていないため、標準 SQL では __PARTITIONS_SUMMARY__ をクエリできません。__PARTITIONS_SUMMARY__ メタテーブルを使用するレガシー SQL クエリは、次のようになります。

    SELECT [COLUMN] FROM [[DATASET].[TABLE]$__PARTITIONS_SUMMARY__]

ここで

  • [DATASET] はデータセットの名前です。
  • [TABLE] は時間分割テーブルの名前です。
  • [COLUMN] は次のいずれかです。
説明
project_id プロジェクトの名前。
dataset_id データセットの名前。
table_id 時間分割テーブルの名前。
partition_id パーティションの名前(日付)。
creation_time パーティションが作成された日時(UTC 1970 年 1 月 1 日からのミリ秒数)。
last_modified_time パーティションが最後に変更された日時(UTC 1970 年 1 月 1 日からのミリ秒数)。

パーティション メタテーブルの権限

__PARTITIONS_SUMMARY__ メタテーブルを使用するクエリジョブを実行するユーザーには、bigquery.jobs.create 権限が必要です。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.jobs.create 権限が含まれています。

また、ユーザーには、データセット レベルで READER 役割が付与されているか、bigquery.tables.getData 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。事前定義されているプロジェクト レベルの IAM 役割のうち、bigquery.userbigquery.jobUserbigquery.metadataViewer 以外の役割には bigquery.tables.getData 権限が含まれています。

パーティション メタテーブルの例

次のクエリは、mydataset.mytable という名前の時間分割テーブルのすべてのパーティション メタデータを取得します。

ウェブ UI

#legacySQL
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

コマンドライン

bq query --use_legacy_sql=true '
SELECT
  *
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

出力は次のようになります。

+----------------+------------+----------------+--------------+---------------+--------------------+
|   project_id   | dataset_id |    table_id    | partition_id | creation_time | last_modified_time |
+----------------+------------+----------------+--------------+---------------+--------------------+
| myproject      | mydataset  | mytable        | 20160314     | 1517190224120 | 1517190224997      |
| myproject      | mydataset  | mytable        | 20160315     | 1517190224120 | 1517190224997      |
+----------------+------------+----------------+--------------+---------------+--------------------+

次のクエリは、mydataset.mytable のパーティションが最後に変更された日時を一覧表示します。

ウェブ UI

#legacySQL
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]

コマンドライン

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  last_modified_time
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

出力は次のようになります。

+--------------+--------------------+
| partition_id | last_modified_time |
+--------------+--------------------+
| 20160102     |      1471632556179 |
| 20160101     |      1471632538142 |
| 20160103     |      1471632570463 |
+--------------+--------------------+

人が読める形式で last_modified_time フィールドを表示するには、FORMAT_UTC_USEC 関数を使用します。次に例を示します。

ウェブ UI

#legacySQL
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.table1$__PARTITIONS_SUMMARY__]

コマンドライン

bq query --use_legacy_sql=true '
SELECT
  partition_id,
  FORMAT_UTC_USEC(last_modified_time*1000) AS last_modified
FROM
  [mydataset.mytable$__PARTITIONS_SUMMARY__]'

出力は次のようになります。

+--------------+----------------------------+
| partition_id |       last_modified        |
+--------------+----------------------------+
| 20160103     | 2016-08-19 18:49:30.463000 |
| 20160102     | 2016-08-19 18:49:16.179000 |
| 20160101     | 2016-08-19 18:48:58.142000 |
+--------------+----------------------------+

次のステップ

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

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

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