テーブルの作成と使用

このドキュメントでは、BigQuery でテーブルを作成して使用する方法について説明します。テーブルを作成した後、以下のことができます。

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

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

テーブルの制限事項

BigQuery テーブルには以下の制限があります。

  • テーブル名はデータセットごとに一意である必要があります。
  • コンソールと従来の BigQuery ウェブ UI でコピーできるのは、一度に 1 つのテーブルのみです。
  • テーブルをコピーするとき、コピー先データセットはコピー元テーブルと同じロケーションに存在する必要があります。たとえば、EU にあるデータセットから US にあるデータセットにテーブルをコピーできません。
  • CLI または API を使用して複数のテーブルを 1 つのテーブルにコピーするときは、すべてのコピー元テーブルのスキーマは同一でなければなりません。
  • コンソール、従来の BigQuery ウェブ UI、コマンドライン ツール、API を使用して削除できるのは一度に 1 つのテーブルのみです。
  • テーブルデータをエクスポートするとき、宛先にできるのは Cloud Storage のみです。
  • データセット内のテーブル数が 50,000 個に近くなると、テーブルの列挙が遅くなります。API 呼び出しと従来の BigQuery ウェブ UI のどちらを使用する場合も列挙のパフォーマンスは低下します。現在、GCP Console の BigQuery ウェブ UI で表示できるテーブル数は、データセットごとに 50,000 個までです。

    従来の BigQuery ウェブ UI のパフォーマンスを向上するには、?minimal パラメータを使用して、表示するテーブル数をプロジェクトごとに 30,000 個に制限します。このパラメータは、BigQuery ウェブ UI の URL に https://bigquery.cloud.google.com/queries/[PROJECT_NAME]?minimal の形式で追加します。

テーブルの作成

BigQuery では、以下のようにテーブルを作成できます。

  • BigQuery ウェブ UI またはコマンドライン ツールの bq mk コマンドを使用して手動で作成する
  • プログラムで tables.insert API メソッドを呼び出して作成する
  • クエリ結果から作成する
  • 外部データソースを参照するテーブルを定義する
  • データを読み込むときに作成する

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 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

スキーマ定義を含む空のテーブルの作成

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

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

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

テーブルを作成した後、そのテーブルにデータの読み込みまたはクエリ結果の書き込みを行うことができます。

スキーマ定義を含む空のテーブルを作成するには:

ウェブ UI

  1. ナビゲーション内のデータセット名の横にある下矢印アイコン 下矢印アイコン をクリックし、[Create new table] をクリックします。

  2. [Create Table] ページの [Source Data] セクションで、[Create empty table] をクリックします。

  3. [Create Table] ページの [Destination Table] セクションで、次の操作を行います。

    • [Table name] で適切なデータセットを選択し、作成するテーブルの名前をテーブル名のフィールドに入力します。
    • [Table type] が [Native table] に設定されていることを確認します。
  4. [Schema] セクションで、スキーマ定義を手動で入力します。

    • スキーマ情報は次の方法で手動で入力できます。

      • [Edit as text] をクリックし、テーブル スキーマを JSON 配列として入力します。

        スキーマを JSON 配列として追加する

      • [Add Field] を使用してスキーマを入力します。

        [Add Field] を使用してスキーマを追加する

  5. [Options] セクションはデフォルト値のままにします。

  6. [Create Table] をクリックします。

コマンドライン

mk コマンドを使用して --table フラグまたは -t フラグを指定します。テーブル スキーマ情報は、インラインまたは JSON ファイルによって指定できます。オプションのパラメータには --expiration--description--time_partitioning_type--destination_kms_key--label があります。デフォルト プロジェクト以外のプロジェクトにテーブルを作成する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

--time_partitioning_type--destination_kms_key についてはここでは説明しません。--time_partitioning_type の詳細については、取り込み時間分割テーブルまたは分割テーブルをご覧ください。--destination_kms_key の詳細については、顧客管理の暗号鍵をご覧ください。

既存のデータセット内にスキーマ定義を含む空のテーブルを作成するには、次のように入力します。

bq mk --table --expiration [INTEGER] --description [DESCRIPTION] --label [KEY:VALUE, KEY:VALUE] [PROJECT_ID]:[DATASET].[TABLE] [SCHEMA]

ここで

  • [INTEGER] はテーブルのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。テーブルの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限設定は無視されます。
  • [DESCRIPTION] はテーブルの説明であり、引用符で囲みます。
  • [KEY:VALUE] は、ラベルを表す Key-Value ペアです。カンマ区切りリストを使用して複数のラベルを入力できます。
  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] は、プロジェクトのデータセットです。
  • [TABLE] は、作成するテーブルの名前です。
  • [SCHEMA] は、[FIELD]:[DATA_TYPE],[FIELD]:[DATA_TYPE] の形式のインライン スキーマ定義、またはローカルマシン上の JSON スキーマ ファイルのパスです。

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

例:

インライン スキーマ定義を使用してテーブルを作成するには、次のコマンドを入力します。このコマンドは、デフォルト プロジェクトにある mydataset 内に mytable という名前のテーブルを作成します。テーブルの存続期間は 3,600 秒(1 時間)、説明は This is my table、ラベルは organization:development に設定されます。このコマンドでは --table ではなく -t ショートカットを使用しています。スキーマはインラインで qtr:STRING,sales:FLOAT,year:STRING と指定されています。

bq mk -t --expiration 3600 --description "This is my table" --label organization:development mydataset.mytable qtr:STRING,sales:FLOAT,year:STRING

次のコマンドを入力し、JSON スキーマ ファイルを使用してテーブルを作成します。このコマンドは、デフォルト プロジェクトにある mydataset 内に mytable という名前のテーブルを作成します。テーブルの存続期間は 3,600 秒(1 時間)、説明は This is my table、ラベルは organization:development に設定されます。/tmp/myschema.json はスキーマ ファイルのパスです。

bq mk --table --expiration 3600 --description "This is my table" --label organization:development mydataset.mytable /tmp/myschema.json

JSON スキーマ ファイルを使用してテーブルを作成するには、次のコマンドを入力します。このコマンドは、myotherproject プロジェクトにある mydataset 内に mytable という名前のテーブルを作成します。テーブルの存続期間は 3,600 秒(1 時間)、説明は This is my table、ラベルは organization:development に設定されます。/tmp/myschema.json はスキーマ ファイルのパスです。

bq mk --table --expiration 3600 --description "This is my table" --label organization:development myotherproject:mydataset.mytable /tmp/myschema.json

テーブルを作成した後、テーブルの有効期限説明ラベルを更新できます。スキーマ定義を変更することもできます。

API

定義済みのテーブル リソースを使用して tables.insert メソッドを呼び出します。

C#

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

using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCreateTable
{
    public BigQueryTable CreateTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        var dataset = client.GetDataset(datasetId);
        // Create schema for new table.
        var schema = new TableSchemaBuilder
        {
            { "full_name", BigQueryDbType.String },
            { "age", BigQueryDbType.Int64 }
        }.Build();
        // Create the table
        return dataset.CreateTable(tableId: "your_table_id", schema: schema);
    }
}

Go

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

sampleSchema := bigquery.Schema{
	{Name: "full_name", Type: bigquery.StringFieldType},
	{Name: "age", Type: bigquery.IntegerFieldType},
}

metaData := &bigquery.TableMetadata{
	Schema:         sampleSchema,
	ExpirationTime: time.Now().AddDate(1, 0, 0), // Table will be automatically deleted in 1 year.
}
tableRef := client.Dataset(datasetID).Table(tableID)
if err := tableRef.Create(ctx, metaData); err != nil {
	return err
}

Java

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

TableId tableId = TableId.of(datasetName, tableName);
// Table field definition
Field field = Field.of(fieldName, LegacySQLTypeName.STRING);
// Table schema definition
Schema schema = Schema.of(field);
TableDefinition tableDefinition = StandardTableDefinition.of(schema);
TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
Table table = bigquery.create(tableInfo);

Node.js

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

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

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const datasetId = "my_new_dataset";
// const tableId = "my_new_table";
// const schema = "Name:string, Age:integer, Weight:float, IsMagic:boolean";

// Creates a client
const bigquery = new BigQuery({projectId});

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

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

console.log(`Table ${table.id} created.`);

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';
// $fields = [
//    [
//        'name' => 'field1',
//        'type' => 'string',
//        'mode' => 'required'
//    ],
//    [
//        'name' => 'field2',
//        'type' => 'integer'
//    ],
//];

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$schema = ['fields' => $fields];
$table = $dataset->createTable($tableId, ['schema' => $schema]);
printf('Created table %s' . PHP_EOL, $tableId);

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('my_dataset')

schema = [
    bigquery.SchemaField('full_name', 'STRING', mode='REQUIRED'),
    bigquery.SchemaField('age', 'INTEGER', mode='REQUIRED'),
]
table_ref = dataset_ref.table('my_table')
table = bigquery.Table(table_ref, schema=schema)
table = client.create_table(table)  # API request

assert table.table_id == 'my_table'

Ruby

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

require "google/cloud/bigquery"

def create_table dataset_id = "my_dataset"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table_id = "my_table"

  table = dataset.create_table table_id do |updater|
    updater.string  "full_name", mode: :required
    updater.integer "age",       mode: :required
  end

  puts "Created table: #{table_id}"
end

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

クエリ結果からテーブルを作成するには、結果を抽出先テーブルに書き込みます。

従来の UI

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

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

  3. [New Query] テキスト領域に有効な SQL クエリを入力します。

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

  5. [Destination Table] セクションで、[Select Table] をクリックします。

  6. [Select Destination Table] ダイアログで次の操作を行います。

    1. [Project] で、抽出先テーブルを作成するプロジェクトを選択します。

    2. [Dataset] で、そのテーブルを格納するデータセットを選択します。

    3. [Table ID] フィールドにテーブル名を入力します。この名前はコピー先データセット内で一意である必要があります。テーブル名の長さは最大 1,024 文字で、a~z、A~Z、0~9、_(アンダースコア文字)のみ含めることができます。

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

  7. [Destination Table] セクションの [Write Preference] で、次のいずれかを選択します。

    • Write if empty - テーブルが空の場合にのみ、クエリ結果をテーブルに書き込みます。
    • Append to table - クエリ結果を既存のテーブルに追加します。
    • Overwrite table - 既存のテーブルにクエリ結果を同じ名前で上書きします。
  8. (省略可)[Processing Location] で [Unspecified] をクリックし、データのロケーションを選択します。

  9. [RUN QUERY] をクリックします。これにより、指定したテーブルにクエリ結果を書き込むクエリジョブが作成されます。

抽出先テーブルを指定せずにクエリを実行した場合は、結果ウィンドウの [Save as Table] ボタンをクリックして一時テーブルを永続テーブルにコピーできます。

CLI

クエリ結果に基づいて永続テーブルを作成するには、bq query コマンドを使用して --destination_table フラグを指定します。標準 SQL 構文を使用するには、use_legacy_sql=false フラグを指定します。デフォルト プロジェクト以外のプロジェクトにあるテーブルにクエリ結果を書き込むには、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセット名に追加します。

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

既存の抽出先テーブルに対する書き込み処理を制御するには、次のオプション フラグのいずれかを指定します。

  • --append_table - 抽出先テーブルが存在する場合、クエリ結果がそのテーブルに追加されます。
  • --replace - 抽出先テーブルが存在する場合、クエリ結果でそのテーブルが上書きされます。

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

ここで

  • [LOCATION] は、クエリの処理に使用するロケーションの名前です。--location フラグはオプションです。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] は、クエリ結果を書き込むテーブルを含むデータセットの名前です。
  • [TABLE] は、クエリ結果を書き込むテーブルの名前です。
  • [QUERY] は標準 SQL 構文のクエリです。

書き込み処理フラグが指定されていない場合は、デフォルトの動作として、テーブルが空の場合にのみ結果が書き込まれます。テーブルが存在していて空でない場合は、次のエラーが返されます。BigQuery error in query operation: Error processing job '[PROJECT_ID]:bqjob_123abc456789_00000e1234f_1': Already Exists: Table [PROJECT_ID]:[DATASET].[TABLE]

例:

mydataset 内の mytable という名前の抽出先テーブルにクエリ結果を書き込むには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトにあります。コマンドに書き込み処理フラグは指定されていないため、抽出先テーブルは新規または空である必要があります。それ以外の場合は Already exists エラーが返されます。このクエリは、USA Name データ一般公開データセットからデータを取得します。

bq --location=US query --destination_table mydataset.mytable --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

クエリ結果を使用して mydataset 内の mytable という名前の抽出先テーブルを上書きするには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトにあります。このコマンドには --replace フラグが指定されているため、抽出先テーブルが上書きされます。

bq --location=US query --destination_table mydataset.mytable --replace --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

mydataset 内の mytable という名前の抽出先テーブルにクエリ結果を追加するには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。このコマンドには --append フラグが指定されているため、クエリ結果が抽出先テーブルに追加されます。

bq --location=US query --destination_table myotherproject:mydataset.mytable --append --use_legacy_sql=false 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC'

API

クエリ結果を永続テーブルに保存するには、jobs.insert メソッドを呼び出して query ジョブを構成し、configuration.query.destinationTable プロパティの値を含めます。既存の抽出先テーブルに対する書き込み処理を制御するには、configuration.query.writeDisposition プロパティを構成します。

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

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")

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

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

クエリの結果を永続テーブルに保存するには、QueryJobConfiguration抽出先テーブルに必要な TableId を設定します。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
// String destinationDataset = 'my_destination_dataset';
// String destinationTable = 'my_destination_table';
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // Note that setUseLegacySql is set to false by default
    QueryJobConfiguration.newBuilder(query)
        // Save the results of the query to a permanent table.
        .setDestinationTable(TableId.of(destinationDataset, destinationTable))
        .build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Python

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

クエリ結果を永続テーブルに保存するには、QueryJobConfig を作成し、抽出先に目的の TableReference を設定します。そのジョブ構成を query メソッドに渡します。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'your_dataset_id'

job_config = bigquery.QueryJobConfig()
# Set the destination table
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""

# Start the query, passing in the extra configuration.
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish
print('Query results loaded to table {}'.format(table_ref.path))

外部データソースを参照するテーブルの作成

外部データソース(フェデレーション データソースとも呼ばれます)は、データが BigQuery に格納されていない場合でも直接クエリできるデータソースです。データの読み込みまたはストリーミングの代わりに、外部データソースを参照するテーブルを作成します。

BigQuery では、次のデータに対して直接クエリを実行できます。

外部データソースに格納されているデータを参照する一時テーブルまたは永続テーブルを作成することにより、サポートされている外部データソース内のデータに対してクエリを実行できます。外部データソースの操作の詳細については、以下をご覧ください。

データ読み込み時のテーブルの作成

BigQuery にデータを読み込むときに、新しいテーブルまたはパーティションにデータを読み込む、既存のテーブルまたはパーティションにデータを追加する、またはテーブルまたはパーティションを上書できます。データを読み込む前に空のテーブルを作成する必要はありません。新しいテーブルの作成とデータの読み込みを同時に行うことができます。

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

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

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

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

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

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

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

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

テーブルデータの操作の詳細については、テーブルデータの管理をご覧ください。

テーブルの使用

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

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

必要な権限

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

CLI

すべてのテーブル情報を表示するには、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

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

Go

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

meta, err := client.Dataset(datasetID).Table(tableID).Metadata(ctx)
if err != nil {
	return err
}
// Print basic information about the table.
fmt.Printf("Schema has %d top-level fields\n", len(meta.Schema))
fmt.Printf("Description: %s\n", meta.Description)
fmt.Printf("Row in managed storage: %d\n", meta.NumRows)

Java

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

TableId tableId = TableId.of(projectId, datasetName, tableName);
Table table = bigquery.getTable(tableId);

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
//$projectId = 'The Google project ID';
//$datasetId = 'The BigQuery dataset ID';
//$tableId   = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);

Python

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

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

dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
table = client.get_table(table_ref)  # API Request

# View table properties
print(table.schema)
print(table.description)
print(table.num_rows)

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

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

必要な権限

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

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

テーブルの一覧表示

データセット内のテーブルを一覧表示するには:

ウェブ UI

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

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

    テーブルの表示

コマンドライン

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

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

ここで

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

このコマンドを実行すると、Type フィールドに TABLE または VIEW が表示されます。次に例を示します。

+-------------------------+-------+----------------------+-------------------+
|         tableId         | Type  |        Labels        | Time Partitioning |
+-------------------------+-------+----------------------+-------------------+
| mytable                 | TABLE | department:shipping  |                   |
| myview                  | VIEW  |                      |                   |
+-------------------------+-------+----------------------+-------------------+

例:

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

bq ls --format=pretty mydataset

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

bq ls --format=pretty myotherproject:mydataset

API

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

C#

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

using Google.Cloud.BigQuery.V2;
using System;
using System.Collections.Generic;
using System.Linq;

public class BigQueryListTables
{
    public void ListTables(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        // Retrieve list of tables in the dataset
        List<BigQueryTable> tables = client.ListTables(datasetId).ToList();
        // Display the results
        if (tables.Count > 0)
        {
            Console.WriteLine($"Tables in dataset {datasetId}:");
            foreach (var table in tables)
            {
                Console.WriteLine($"\t{table.Reference.TableId}");
            }
        }
        else
        {
            Console.WriteLine($"{datasetId} does not contain any tables.");
        }
    }
}

Go

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

ts := client.Dataset(datasetID).Tables(ctx)
for {
	t, err := ts.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Fprintf(w, "Table: %q\n", t.TableID)
}

Java

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

DatasetId datasetId = DatasetId.of(projectId, datasetName);
Page<Table> tables = bigquery.listTables(datasetId, TableListOption.pageSize(100));
for (Table table : tables.iterateAll()) {
  // do something with the table
}

Node.js

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

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

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const datasetId = "my_dataset";

// Creates a client
const bigquery = new BigQuery({projectId});

// Lists all tables in the dataset
const [tables] = await bigquery.dataset(datasetId).getTables();

console.log('Tables:');
tables.forEach(table => console.log(table.id));

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId  = 'The Google project ID';
// $datasetId  = 'The BigQuery dataset ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$tables = $dataset->tables();
foreach ($tables as $table) {
    print($table->id() . PHP_EOL);
}

Python

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

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('my_dataset')

tables = list(client.list_tables(dataset_ref))  # API request(s)
assert len(tables) == 0

table_ref = dataset.table('my_table')
table = bigquery.Table(table_ref)
client.create_table(table)                  # API request
tables = list(client.list_tables(dataset))  # API request(s)

assert len(tables) == 1
assert tables[0].table_id == 'my_table'

Ruby

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

require "google/cloud/bigquery"

def list_tables dataset_id = "your_dataset_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id

  puts "Tables in dataset #{dataset_id}:"
  dataset.tables.each do |table|
    puts "\t#{table.table_id}"
  end
end

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

BigQuery には、メタデータ(データセット内のテーブルやビューのリストなど)が格納された特別なテーブルがあります。これらの「メタテーブル」は読み取り専用です。データセット内のテーブルやビューに関するメタデータにアクセスするには、クエリの SELECT ステートメントで __TABLES_SUMMARY__ メタテーブルを使用します。クエリを実行するには、コンソール、従来の BigQuery ウェブ UI、コマンドライン ツールの bq query コマンドのいずれかを使用するか、jobs.insert API メソッドを呼び出してクエリジョブを構成します。

__TABLES_SUMMARY__ メタテーブルを使用するクエリは次のようになります。

    SELECT [FIELD] FROM [DATASET].__TABLES_SUMMARY__

ここで

  • DATASET はデータセットの名前です。
  • FIELD は以下のいずれかです。
説明
project_id プロジェクトの名前。
dataset_id データセットの名前。
table_id テーブルまたはビューの名前。
creation_time テーブルまたはビューが作成された時刻(UTC 1970 年 1 月 1 日からのミリ秒数)。
type テーブルの種類を表す整数。通常のテーブルは 1、ビューは 2。

必要な権限

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

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

メタテーブルの制限事項

メタテーブルには以下の制限があります。

  • 一般に、__TABLES_SUMMARY__ の検索速度が実用的な速さになるのはデータセット内のテーブル数が数千以下の場合です。データセットのサイズがこれより大きくなると、__TABLES_SUMMARY__ の検索速度は徐々に遅くなり、使用可能なリソースを超過する可能性があります。
  • メタテーブルを tables.insert メソッドで使用することはできません。
  • メタテーブルを宛先テーブルとして使用することはできません。
  • メタテーブルは、レガシー SQL のテーブル デコレータをサポートしていません。
  • メタテーブルは、データセット内のテーブルのリストには表示されません。

メタテーブルの例

次のクエリは、bigquery-public-data.samples データセットのすべてのメタデータを取得します。

従来の UI

#standardSQL
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

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

+----------------------+------------+-----------------+---------------+------+
| project_id           | dataset_id |    table_id     | creation_time | type |
+----------------------+------------+-----------------+---------------+------+
| bigquery-public-data | samples    | github_nested   | 1348782587310 |    1 |
| bigquery-public-data | samples    | github_timeline | 1335915950690 |    1 |
| bigquery-public-data | samples    | gsod            | 1335916040125 |    1 |
| bigquery-public-data | samples    | natality        | 1335916045005 |    1 |
| bigquery-public-data | samples    | shakespeare     | 1335916045099 |    1 |
| bigquery-public-data | samples    | trigrams        | 1335916127449 |    1 |
| bigquery-public-data | samples    | wikipedia       | 1335916132870 |    1 |
+----------------------+------------+-----------------+---------------+------+

次のクエリは、bigquery-public-data.samples データセット内のすべてのテーブルとビューのリストを取得します。

従来の UI

#standardSQL
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

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

+-----------------+
|    table_id     |
+-----------------+
| github_nested   |
| github_timeline |
| gsod            |
| natality        |
| shakespeare     |
| trigrams        |
| wikipedia       |
+-----------------+

次のクエリは、bigquery-public-data.samples データセット内の各テーブルの種類のリストを取得します。

従来の UI

#standardSQL
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

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

+-----------------+------+
|    table_id     | type |
+-----------------+------+
| github_nested   |   1  |
| github_timeline |   1  |
| gsod            |   1  |
| natality        |   1  |
| shakespeare     |   1  |
| trigrams        |   1  |
| wikipedia       |   1  |
+-----------------+------+

次のステップ

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

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

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