テーブルの作成と使用

このドキュメントでは、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 でテーブルを作成できます。

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

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

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

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

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

テーブルを作成した後、そのテーブルに対してデータの読み込みまたはクエリ結果の書き込みによってデータを入力できます。

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

Console

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

  2. ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。

  3. ウィンドウの右側の詳細パネルで、[テーブルを作成] をクリックします。データを読み込むプロセスは、空のテーブルを作成するプロセスと同じです。

    テーブルを作成

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

  5. [テーブルを作成] ページの [送信先] セクションで、次の操作を行います。

    • [データセット名] で、該当するデータセットを選択します。

      データセットを選択

    • [テーブル名] フィールドに、BigQuery で作成するテーブルの名前を入力します。

    • [テーブルタイプ] が [ネイティブ テーブル] に設定されていることを確認します。

  6. [スキーマ] セクションにスキーマ定義を入力します。

    • スキーマ情報を手動で入力するには、次の方法があります。

      • [テキストとして編集] を有効にし、テーブル スキーマを JSON 配列として入力します。

      • [フィールドを追加] を使用して、スキーマを手動で入力します。

  7. [詳細オプション] セクションはデフォルト値のままにします。

  8. [詳細オプション] セクションで該当する項目を選択し、[テーブルを作成] をクリックします。利用可能なオプションの詳細については、JSON のオプションをご覧ください。

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

従来の 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 クイックスタート: クライアント ライブラリの使用にある 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 のリファレンス ドキュメントをご覧ください。

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

async function createTable() {
  // Creates a new table named "my_table" in "my_dataset".

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

  // Create a client
  const bigqueryClient = new BigQuery();

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

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

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

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

schema = [
    bigquery.SchemaField("full_name", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
]

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to create
# table_id = "your-project.your_dataset.your_table_name"

table = bigquery.Table(table_id, schema=schema)
table = client.create_table(table)  # API request
print(
    "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)
)

Ruby

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある 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

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

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

Console

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

  2. ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。

  3. クエリエディタが表示されていない場合は、ウィンドウの右上にある [エディタを表示] をクリックします。

  4. [クエリエディタ] テキスト領域に有効な SQL クエリを入力します。

  5. エディタの下にある [展開] クリックし、[クエリの設定] を選択します。

    クエリの設定

  6. [クエリ結果の宛先テーブルを設定する] チェックボックスをオンにします。

    宛先の設定

  7. [送信先] セクションで、テーブルを作成する適切な [プロジェクト名] と [データセット名] を選択し、[テーブル名] を選択します。

  8. [宛先テーブルの書き込み設定] セクションで、次のいずれかを選択します。

    • 空の場合に書き込む - テーブルが空の場合にのみ、クエリ結果をテーブルに書き込みます。
    • テーブルに追加する - クエリ結果を既存のテーブルに追記します。
    • テーブルを上書きする - クエリ結果を使用して既存のテーブルを同じ名前で上書きします。
  9. (省略可)[処理を行うロケーション] で [自動選択] をクリックし、データのロケーションを選択します。

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

クエリを実行する前に宛先テーブルを指定するのを忘れた場合は、エディタの下の [ビューを保存] ボタンをクリックして一時テーブルを永続テーブルにコピーできます。

従来の UI

オプション 1: DDL ステートメントを使用する

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

詳細については、CREATE TABLE ステートメントのページと、既存のテーブルから新しいテーブルを作成する CREATE TABLE の例をご覧ください。

オプション 2: 従来のウェブ 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 - テーブルが空の場合にのみ、クエリ結果をテーブルに書き込みます。
    • テーブルに追加する - クエリ結果を既存のテーブルに追記します。
    • 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 カスタム役割を作成することもできます。カスタム役割を作成する場合、付与する権限は、ユーザー、グループ、サービス アカウントにどのテーブル オペレーションを許可するかによって異なります。

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

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

テーブルの使用

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

テーブルに関する情報またはメタデータは、次の方法で入手できます。

  • GCP Console または従来の BigQuery ウェブ UI
  • bq show CLI コマンド
  • tables.get API メソッドの呼び出し
  • INFORMATION_SCHEMA ビューのクエリ(ベータ版

必要な権限

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

テーブルの情報の取得

テーブルに関する情報を取得するには、次の操作を行います。

Console

  1. ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。データセット名をクリックして展開します。これにより、データセット内のテーブルとビューが表示されます。

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

  3. エディタの下にある [詳細] をクリックします。表示されるページに、テーブルの説明とテーブル情報が示されます。

  4. テーブルのスキーマ定義を表示するには、[スキーマ] タブをクリックします。

従来の 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 クイックスタート: クライアント ライブラリの使用の 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

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the model to fetch.
# table_id = 'your-project.your_dataset.your_table'

table = client.get_table(table_id)

print(
    "Got table '{}.{}.{}'.".format(table.project, table.dataset_id, table.table_id)
)

# View table properties
print("Table schema: {}".format(table.schema))
print("Table description: {}".format(table.description))
print("Table has {} rows".format(table.num_rows))

INFORMATION_SCHEMA を使用したテーブル情報の取得(ベータ版

INFORMATION_SCHEMA は、データセット、テーブル、ビューに関するメタデータへのアクセスを提供する一連のビューです。

INFORMATION_SCHEMA.TABLES および INFORMATION_SCHEMA.TABLE_OPTIONS ビューにクエリを実行し、プロジェクト内のテーブルとビューに関するメタデータを取得できます。INFORMATION_SCHEMA.COLUMNSINFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューにクエリを実行し、テーブル内の列(フィールド)に関するメタデータを取得することもできます。

TABLESTABLE_OPTIONS ビューには、ビューに関する概要情報も含まれています。詳細情報を取得するには、INFORMATION_SCHEMA.VIEWS ビューに対してクエリを実行します。

TABLES ビュー

INFORMATION_SCHEMA.TABLES ビューにクエリを実行すると、クエリ結果として、データセット内のテーブルまたはビューごとに 1 行が表示されます。

INFORMATION_SCHEMA.TABLES ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルまたはビューの格納先であるデータセットへのアクセス権が必要です。

INFORMATION_SCHEMA.TABLES ビューのスキーマは次のとおりです。

列名 データ型
TABLE_CATALOG STRING データセットを含むプロジェクトの名前
TABLE_SCHEMA STRING テーブルまたはビューを含むデータセットの名前datasetId
TABLE_NAME STRING テーブルまたはビューの名前tableId
TABLE_TYPE STRING 次のテーブルタイプ:
IS_INSERTABLE_INTO STRING YES または NO(テーブルが DML INSERT ステートメントに対応しているかどうかによる)
IS_TYPED STRING 値は常に NO
CREATION_TIME TIMESTAMP テーブルの作成時間

例 1:

次の例では、将来用に予約されている is_typed を除き、すべての列を INFORMATION_SCHEMA.TABLES ビューから取得します。デフォルト プロジェクト(myproject)にある mydataset のすべてのテーブルに対するメタデータが返されます。

mydataset には、次のテーブルが含まれています。

  • mytable1: 標準の BigQuery テーブル
  • myview1: BigQuery ビュー

INFORMATION_SCHEMA.TABLES ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW] (例: `myproject`.mydataset.INFORMATION_SCHEMA.TABLES

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     * EXCEPT(is_typed)
    FROM
     mydataset.INFORMATION_SCHEMA.TABLES
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * EXCEPT(is_typed) FROM mydataset.INFORMATION_SCHEMA.TABLES'

結果は次のようになります。

  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | table_catalog  | table_schema  |   table_name   | table_type | is_insertable_into |    creation_time    |
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | myproject      | mydataset     | mytable1       | BASE TABLE | YES                | 2018-10-29 20:34:44 |
  | myproject      | mydataset     | myview1        | VIEW       | NO                 | 2018-12-29 00:19:20 |
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  

例 2:

次の例では、INFORMATION_SCHEMA.TABLES ビューからタイプが BASE TABLE のすべてのテーブルを取得します。is_typed 列は除外されます。デフォルト プロジェクト(myproject)にある mydataset のテーブルに対するメタデータが返されます。

INFORMATION_SCHEMA.TABLES ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW] (例: `myproject`.mydataset.INFORMATION_SCHEMA.TABLES

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     * EXCEPT(is_typed)
    FROM
     mydataset.INFORMATION_SCHEMA.TABLES
    WHERE
     table_type="BASE TABLE"
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * EXCEPT(is_typed) FROM mydataset.INFORMATION_SCHEMA.TABLES
WHERE table_type="BASE TABLE"'

結果は次のようになります。

  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | table_catalog  | table_schema  |   table_name   | table_type | is_insertable_into |    creation_time    |
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  | myproject      | mydataset     | mytable1       | BASE TABLE | NO                 | 2018-10-31 22:40:05 |
  +----------------+---------------+----------------+------------+--------------------+---------------------+
  

TABLE_OPTIONS ビュー

INFORMATION_SCHEMA.TABLE_OPTIONS ビューにクエリを実行すると、クエリ結果として、データセット内のテーブルまたはビューごとに 1 行が表示されます。

INFORMATION_SCHEMA.TABLE_OPTIONS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルまたはビューの格納先であるデータセットへのアクセス権が必要です。

INFORMATION_SCHEMA.TABLE_OPTIONS ビューのスキーマは次のとおりです。

列名 データ型
TABLE_CATALOG STRING データセットを含むプロジェクトの名前
TABLE_SCHEMA STRING テーブルまたはビューを含むデータセットの名前datasetId
TABLE_NAME STRING テーブルまたはビューの名前tableId
OPTION_NAME STRING options テーブル内の名前値の 1 つ
OPTION_TYPE STRING options テーブルのデータ型値の 1 つ
OPTION_VALUE STRING options テーブルの値オプションの 1 つ
options テーブル
OPTION_NAME OPTION_TYPE OPTION_VALUE
partition_expiration_days FLOAT64 分割テーブルのすべてのパーティションのデフォルトの存続期間(日数)
expiration_timestamp FLOAT64 テーブルのデフォルトの存続期間(日数)
kms_key_name STRING テーブルの暗号化に使用される Cloud KMS キーの名前
friendly_name STRING テーブルのわかりやすい名前
description STRING テーブルの説明
labels ARRAY<STRUCT<STRING, STRING>> テーブルのラベルを表す STRUCT の配列

例 1:

次の例では、INFORMATION_SCHEMATA.TABLE_OPTIONS ビューにクエリを実行して、デフォルト プロジェクト(myproject)にある mydataset の全テーブルのデフォルトのテーブル有効期限を取得します。

INFORMATION_SCHEMA.TABLE_OPTIONS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW] (例: `myproject`.mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     *
    FROM
     mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS
    WHERE
     option_name="expiration_timestamp"
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS
WHERE option_name="expiration_timestamp"'

結果は次のようになります。

  +----------------+---------------+------------+----------------------+-------------+--------------------------------------+
  | table_catalog  | table_schema  | table_name |     option_name      | option_type |             option_value             |
  +----------------+---------------+------------+----------------------+-------------+--------------------------------------+
  | myproject      | mydataset     | mytable1   | expiration_timestamp | TIMESTAMP   | TIMESTAMP "2020-01-16T21:12:28.000Z" |
  | myproject      | mydataset     | mytable2   | expiration_timestamp | TIMESTAMP   | TIMESTAMP "2021-01-01T21:12:28.000Z" |
  +----------------+---------------+------------+----------------------+-------------+--------------------------------------+
  

例 2:

次の例では、mydataset 内のすべてのテーブルから、テストデータを含むテーブルを絞り込んでそのメタデータを取得します。クエリでは、説明に「test」が含まれているテーブルを見つけるために description オプションの値を使用します。mydataset はデフォルト プロジェクト(myproject)内にあります。

デフォルト プロジェクト以外のプロジェクトに対してクエリを実行するには、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW] (例: `myproject`.mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     *
    FROM
     mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS
    WHERE
     option_name="description" AND option_value LIKE "%test%"
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * FROM mydataset.INFORMATION_SCHEMA.TABLE_OPTIONS
WHERE option_name="description" AND option_value LIKE "%test%"'

結果は次のようになります。

  +----------------+---------------+------------+-------------+-------------+--------------+
  | table_catalog  | table_schema  | table_name | option_name | option_type | option_value |
  +----------------+---------------+------------+-------------+-------------+--------------+
  | myproject      | mydataset     | mytable1   | description | STRING      | "test data"  |
  | myproject      | mydataset     | mytable2   | description | STRING      | "test data"  |
  +----------------+---------------+------------+-------------+-------------+--------------+
  

COLUMNS ビュー

INFORMATION_SCHEMA.COLUMNS ビューにクエリを実行すると、クエリ結果として、テーブル内の列(フィールド)ごとに 1 行が表示されます。

INFORMATION_SCHEMA.COLUMNS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

INFORMATION_SCHEMA.COLUMNS ビューのスキーマは次のとおりです。

列名 データ型
TABLE_CATALOG STRING データセットを含むプロジェクトの名前
TABLE_SCHEMA STRING テーブルを含むデータセットの名前datasetId
TABLE_NAME STRING テーブルまたはビューの名前tableId
COLUMN_NAME STRING 列の名前
ORDINAL_POSITION INT64 テーブル内の列の 1 から始まるオフセット。_PARTITIONTIME や _PARTITIONDATE などの疑似列の場合、値は NULL
IS_NULLABLE STRING YES または NO(列のモードNULL 値を許可するかどうかによる)
DATA_TYPE STRING 列の標準 SQL データ型
IS_GENERATED STRING 値は常に NEVER
GENERATION_EXPRESSION STRING 値は常に NULL
IS_STORED STRING 値は常に NULL
IS_HIDDEN STRING YES または NO(列が _PARTITIONTIME や _PARTITIONDATE などの疑似列であるかどうかによる)
IS_UPDATABLE STRING 値は常に NULL
IS_SYSTEM_DEFINED STRING YES または NO(列が _PARTITIONTIME や _PARTITIONDATE などの疑似列であるかどうかによる)
IS_PARTITIONING_COLUMN STRING YES または NO(列がパーティショニング列かどうかによる)
CLUSTERING_ORDINAL_POSITION STRING テーブルのクラスタリング列内の列の 1 から始まるオフセット。テーブルがクラスタ化テーブルでない場合、値は NULL

次の例では、census_bureau_usa データセット内にある population_by_zip_2010 テーブルの INFORMATION_SCHEMA.COLUMNS ビューからメタデータを取得します。このデータセットは、BigQuery の一般公開データセット プログラムの一部です。

このテーブルは bigquery-public-data プロジェクトにあるため、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW] (例: `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.TABLES

次の列は現時点で将来用に予約されているため、クエリ結果から除外されます。

  • IS_GENERATED
  • GENERATION_EXPRESSION
  • IS_STORED
  • IS_UPDATABLE

INFORMATION_SCHEMA.COLUMNS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     * EXCEPT(is_generated, generation_expression, is_stored, is_updatable)
    FROM
     `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
    WHERE
     table_name="population_by_zip_2010"
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * EXCEPT(is_generated, generation_expression, is_stored, is_updatable)
FROM `bigquery-public-data`.census_bureau_usa.INFORMATION_SCHEMA.COLUMNS
WHERE table_name="population_by_zip_2010"'

結果は次のようになります。読みやすくするために、table_catalogtable_schema は結果から除外されています。

+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+
|       table_name       | column_name | ordinal_position | is_nullable | data_type | is_hidden | is_system_defined | is_partitioning_column | clustering_ordinal_position |
+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+
| population_by_zip_2010 | zipcode     |                1 | NO          | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | geo_id      |                2 | YES         | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | minimum_age |                3 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | maximum_age |                4 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | gender      |                5 | YES         | STRING    | NO        | NO                | NO                     |                        NULL |
| population_by_zip_2010 | population  |                6 | YES         | INT64     | NO        | NO                | NO                     |                        NULL |
+------------------------+-------------+------------------+-------------+-----------+-----------+-------------------+------------------------+-----------------------------+
  

COLUMN_FIELD_PATHS ビュー

INFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューにクエリを実行すると、クエリ結果では、RECORD(または STRUCT)列内のネストされた列ごとに 1 行が出力されます。

INFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

INFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューのスキーマは次のとおりです。

列名 データ型
TABLE_CATALOG STRING データセットを含むプロジェクトの名前
TABLE_SCHEMA STRING テーブルを含むデータセットの名前datasetId
TABLE_NAME STRING テーブルまたはビューの名前tableId
COLUMN_NAME STRING 列の名前
FIELD_PATH STRING `RECORD`(または `STRUCT`)列内でネストされた列のパス
DATA_TYPE STRING 列の標準 SQL データ型
DESCRIPTION STRING 列の説明

次の例では、github_repos データセット内にある commits テーブルの INFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューからメタデータを取得します。このデータセットは、BigQuery の一般公開データセット プログラムの一部です。

このテーブルは bigquery-public-data プロジェクトにあるため、次の形式でプロジェクト ID をデータセットに追加します。 `[PROJECT_ID]`.[DATASET].INFORMATION_SCHEMA.[VIEW](例: `bigquery-public-data`.github_repos.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS

commits テーブルには、次のネストされた列と、ネストされて繰り返された列があります。

  • author: ネストされた RECORD
  • committer: ネストされた RECORD
  • trailer: ネストされて繰り返された RECORD
  • difference: ネストされて繰り返された RECORD

クエリでは、author および difference 列に関するメタデータを取得します。

INFORMATION_SCHEMA.COLUMN_FIELD_PATHS ビューに対するクエリでは、データセット修飾子を指定する必要があります。また、クエリを発行するには、テーブルの格納先であるデータセットへのアクセス権が必要です。

クエリを実行するには:

Console

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

    BigQuery ウェブ UI に移動

  2. [クエリエディタ] ボックスに、次の標準 SQL クエリを入力します。 INFORMATION_SCHEMA では標準 SQL 構文が必要です。標準 SQL は GCP Console のデフォルトの構文です。

    SELECT
     *
    FROM
     `bigquery-public-data`.github_repos.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS
    WHERE
     table_name="commits"
     AND column_name="author"
     OR column_name="difference"
    
  3. [実行] をクリックします。

コマンドライン

query コマンドラインで、--nouse_legacy_sql または --use_legacy_sql=false フラグを使用して標準 SQL 構文を指定します。INFORMATION_SCHEMA クエリには標準 SQL 構文が必要です。

クエリを実行するには、次のように入力します。

bq query --nouse_legacy_sql \
'SELECT * FROM `bigquery-public-data`.github_repos.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS
WHERE table_name="commits" AND column_name="author" OR column_name="difference"'

結果は次のようになります。読みやすくするために、table_catalogtable_schema は結果から除外されています。

  +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
  | table_name | column_name |     field_path      |                                                                      data_type                                                                      | description |
  +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
  | commits    | author      | author              | STRUCT<name STRING, email STRING, time_sec INT64, tz_offset INT64, date TIMESTAMP>                                                                  | NULL        |
  | commits    | author      | author.name         | STRING                                                                                                                                              | NULL        |
  | commits    | author      | author.email        | STRING                                                                                                                                              | NULL        |
  | commits    | author      | author.time_sec     | INT64                                                                                                                                               | NULL        |
  | commits    | author      | author.tz_offset    | INT64                                                                                                                                               | NULL        |
  | commits    | author      | author.date         | TIMESTAMP                                                                                                                                           | NULL        |
  | commits    | difference  | difference          | ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, new_path STRING, old_sha1 STRING, new_sha1 STRING, old_repo STRING, new_repo STRING>> | NULL        |
  | commits    | difference  | difference.old_mode | INT64                                                                                                                                               | NULL        |
  | commits    | difference  | difference.new_mode | INT64                                                                                                                                               | NULL        |
  | commits    | difference  | difference.old_path | STRING                                                                                                                                              | NULL        |
  | commits    | difference  | difference.new_path | STRING                                                                                                                                              | NULL        |
  | commits    | difference  | difference.old_sha1 | STRING                                                                                                                                              | NULL        |
  | commits    | difference  | difference.new_sha1 | STRING                                                                                                                                              | NULL        |
  | commits    | difference  | difference.old_repo | STRING                                                                                                                                              | NULL        |
  | commits    | difference  | difference.new_repo | STRING                                                                                                                                              | NULL        |
  +------------+-------------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+-------------+
  

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

データセット内のテーブルは、次の方法で一覧表示できます。

  • GCP Console または従来の BigQuery ウェブ UI
  • bq ls CLI コマンド
  • tables.list API メソッドの呼び出し

必要な権限

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

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

テーブルの一覧表示

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

Console

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

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

従来の 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 クイックスタート: クライアント ライブラリの使用にある 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 のリファレンス ドキュメントをご覧ください。

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

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

// Create a client
const bigqueryClient = new BigQuery();

async function listTables() {
  // Lists tables in "my_dataset".

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

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

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

# TODO(developer): Construct a BigQuery client object.
# client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset that contains
#                  the tables you are listing.
# dataset_id = 'your-project.your_dataset'

tables = client.list_tables(dataset_id)

print("Tables contained in '{}':".format(dataset_id))
for table in tables:
    print("{}.{}.{}".format(table.project, table.dataset_id, table.table_id))

Ruby

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある 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

次のステップ

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

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

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