インタラクティブ クエリとバッチクエリのジョブの実行

このドキュメントでは、インタラクティブ(オンデマンド)クエリ、およびバッチクエリのジョブを実行する方法について説明します。

必要な権限

ジョブとは、データの読み込みデータのエクスポートデータのクエリデータのコピーなど、BigQuery がユーザーに代わって実行するアクションのことです。

コンソール、従来の BigQuery ウェブ UI、または CLI を使用してデータの読み込み、エクスポート、クエリ、コピーを行うと、ジョブリソースの作成、スケジュール、実行が自動的に行われます。また、読み込み、エクスポート、クエリ、コピーのジョブをプログラムで作成することもできます。プログラムでジョブを作成すると、BigQuery によってジョブがスケジュールされ、実行されます。

ジョブの実行には長い時間がかかる場合があるため、ジョブは非同期で実行され、ステータスをポーリングできます。リソースの一覧表示やメタデータの取得など、短時間のアクションは、ジョブリソースでは管理されません。

クエリジョブを実行するには、bigquery.jobs.create 権限が必要です。クエリジョブが正常に完了するためには、ユーザーまたはグループも、クエリによって参照されるテーブルを含むデータセットにアクセスできる必要があります。

次の定義済み IAM 役割のいずれかを付与すると、プロジェクト レベルで bigquery.jobs.create 権限を設定できます。

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

プロジェクト レベルでユーザーまたはグループに bigquery.user の役割を割り当てても、デフォルトでは、プロジェクト内のデータセット、テーブル、ビューに対するアクセス権は付与されません。bigquery.user は、ユーザーが独自のデータセットを作成したり、アクセス権が付与されているデータセットに対してクエリジョブを実行したりできるようにするための役割です。bigquery.user または bigquery.jobUser の役割を割り当てる際は、そのユーザーまたはグループがアクセスする必要のある、他のユーザーまたはグループが作成したデータセットそれぞれに対するアクセス制御も割り当てる必要があります。

データセットに対するアクセス権を割り当てる際のオプションには、次の 3 つがあります。

  • 「Can view」は、データセットの bigquery.dataViewer 役割にマッピングします。
  • 「Can edit」は、データセットの bigquery.dataEditor 役割にマッピングします。
  • 「Is owner」は、データセットの bigquery.dataOwner 役割にマッピングします。

ユーザーがクエリを実行するために必要な最小限のアクセス権は「Can view」です。

BigQuery での IAM 役割の詳細については、アクセス制御をご覧ください。

インタラクティブ クエリの実行

デフォルトでは、BigQuery はインタラクティブ(オンデマンド)クエリジョブを実行します。つまり、クエリは可能な限りすぐに実行されます。インタラクティブ クエリは、同時実行レート制限と日次制限に対してカウントされます。

クエリの結果は、一時テーブルまたは永続テーブルのいずれかに保存されます。既存のテーブルにデータを追加するか上書きするか、あるいは同じ名前のテーブルがない場合は新しいテーブルを作成するかどうかを選択できます。

一時テーブルに書き込むインタラクティブ クエリを実行するには:

従来の UI

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

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

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

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

  5. (省略可)[Processing Location] で [Unspecified] をクリックし、データのロケーションを選択します。

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

これにより、出力を一時テーブルに書き込むクエリジョブが作成されます。

コマンドライン

bq query コマンドを入力し、クエリテキストを含めます。--location フラグを指定して、その値を該当するロケーションに設定します。

次のオプションのフラグを指定できます。このリストには、最も一般的なフラグのいくつかが含まれています。query コマンドのフラグの完全なリストについては、bq コマンドライン ツールのリファレンスで bq query をご覧ください。

次のフラグを指定できます。

  • クエリ結果に基づいて永続テーブルを作成する場合は、--destination_table フラグを指定します。デフォルト以外のプロジェクトにあるテーブルにクエリ結果を書き込むには、[PROJECT_ID]:[DATASET] の形式でデータセット名にプロジェクト ID を追加します。--destination_table を指定しない場合、出力を一時(キャッシュ)テーブルに書き込むクエリジョブが生成されます。
  • クエリ結果を宛先テーブルに追加する場合は、--append_table フラグを指定します。
  • Cloud KMS 鍵を使用して宛先テーブルのデータを暗号化する場合は、--destination_kms_key フラグを指定します。
  • 標準の SQL 構文を使用する場合は、--use_legacy_sql=false フラグを指定します。.bigqueryrc ファイルを使用して、コマンドライン ツールのデフォルト構文を設定できます。
  • クエリジョブに [KEY]:[VALUE] 形式のラベルを適用する場合は、--label フラグを指定します。複数のラベルを指定するには、このフラグを繰り返します。
  • クエリ結果で返される行数を指定する場合は、--max_rows または -n のフラグを指定します。
  • クエリに対して課金されるバイト数を制限する場合は、--maximum_bytes_billed フラグを指定します。クエリがこのフラグで設定した制限を超える場合、そのクエリは失敗します(料金は発生しません)。指定しない場合、課金されるバイトはプロジェクトのデフォルトに設定されます。
  • ユーザー定義の関数リソースとして使用するコードファイルを読み込み、評価する場合は、--udf_resource フラグを指定します。Cloud Storage の URI またはローカル コードファイルのパスを指定できます。複数のファイルを指定するには、このフラグを繰り返します。

標準 SQL 構文を使用してインタラクティブ クエリを実行するには、次のコマンドを入力します。

bq --location=[LOCATION] query --use_legacy_sql=false '[QUERY]'

ここで

  • [LOCATION] は、クエリが処理されるロケーションの名前です。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [QUERY] は標準 SQL 構文のクエリです。

例:

mydataset 内の mytable という名前の宛先テーブルにインタラクティブ クエリ結果を書き込むには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトにあります。このクエリは、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 という名前の宛先テーブルにインタラクティブ クエリ結果を書き込むには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。このクエリは、分割されていないテーブル(USA Name データの一般公開データセット)からデータを取得します。

bq --location=US query --destination_table myotherproject: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'

詳細については、bq コマンドライン ツールの使用をご覧ください。

API

API を使用してクエリを実行するには、新しいジョブを挿入して、jobs#configuration.query プロパティに値を入力します。ジョブリソースjobReference セクションにある location プロパティでロケーションを指定します。

getQueryResults を呼び出して、結果をポーリングします。jobCompletetrue になるまでポーリングを続けます。その後、エラーリストでエラーと警告を確認します。

C#

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

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

public class BigQueryQuery
{
    public void Query(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseQueryCache = false });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

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 name FROM `bigquery-public-data.usa_names.usa_1910_2013` " +
		"WHERE state = \"TX\" " +
		"LIMIT 100")
// Location must match that of the dataset(s) referenced in the query.
q.Location = "US"
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 のリファレンス ドキュメントをご覧ください。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).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");
}

Node.js

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

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

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

const query = `SELECT name
  FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
  WHERE state = 'TX'
  LIMIT 100`;
const options = {
  query: query,
  // Location must match that of the dataset(s) referenced in the query.
  location: 'US',
};

// Runs the query as a job
const [job] = await bigquery.createQueryJob(options);
console.log(`Job ${job.id} started.`);

// Waits for the query to finish
const [rows] = await job.getQueryResults();

// Prints the results
console.log('Rows:');
rows.forEach(row => console.log(row));

PHP

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

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$jobConfig = $bigQuery->query($query);
$job = $bigQuery->startQuery($jobConfig);

$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
$queryResults = $job->queryResults();

$i = 0;
foreach ($queryResults as $row) {
    printf('--- Row %s ---' . PHP_EOL, ++$i);
    foreach ($row as $column => $value) {
        printf('%s: %s' . PHP_EOL, $column, json_encode($value));
    }
}
printf('Found %s row(s)' . PHP_EOL, $i);

Python

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

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

query = (
    'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
    'WHERE state = "TX" '
    'LIMIT 100')
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location='US')  # API request - starts the query

for row in query_job:  # API request - fetches results
    # Row values can be accessed by field name or index
    assert row[0] == row.name == row['name']
    print(row)

Ruby

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

require "google/cloud/bigquery"

def query
  bigquery = Google::Cloud::Bigquery.new
  sql = "SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` " +
        "WHERE state = 'TX' " +
        "LIMIT 100"

  # Location must match that of the dataset(s) referenced in the query.
  results = bigquery.query sql do |config|
    config.location = "US"
  end

  results.each do |row|
    puts row.inspect
  end
end

バッチクエリの実行

BigQuery ではバッチクエリも提供されています。BigQuery はユーザーに代わって各バッチクエリをキューに格納し、アイドル状態のリソースが使用可能になり次第(通常は数分以内)、クエリを開始します。24 時間以内にクエリが開始されなかった場合、BigQuery はジョブの優先度をインタラクティブに変更します。

バッチクエリは同時実行レート制限の対象としてカウントされないので、簡単に多くのクエリを一度に開始できます。バッチクエリは、インタラクティブ(オンデマンド)クエリと同じリソースを使用します。定額料金設定を使用すると、割り当てられたスロットをバッチクエリとインタラクティブ クエリで分け合います。

バッチクエリを実行するには:

従来の UI

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

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

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

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

  5. [Query Priority] セクションで、[Batch] オプションをオンにします。

  6. (省略可)[Processing Location] で [Unspecified] をクリックし、データのロケーションを選択します。

  7. [RUN QUERY] ボタンをクリックします。

コマンドライン

bq query コマンドを入力し、クエリテキストを含めます。バッチクエリを実行するには、--batch フラグを指定します。--location フラグを指定して、その値を該当するロケーションに設定します。

次のオプションのフラグを指定できます。このリストには、最も一般的なフラグのいくつかが含まれています。query コマンドのフラグの完全なリストについては、bq コマンドライン ツールのリファレンスで bq query をご覧ください。

次のフラグを指定できます。

  • クエリ結果に基づいて永続テーブルを作成する場合は、--destination_table フラグを指定します。デフォルト以外のプロジェクトにあるテーブルにクエリ結果を書き込むには、[PROJECT_ID]:[DATASET] の形式でデータセット名にプロジェクト ID を追加します。--destination_table を指定しない場合、出力を一時(キャッシュ)テーブルに書き込むクエリジョブが生成されます。
  • クエリ結果を宛先テーブルに追加する場合は、--append_table フラグを指定します。
  • Cloud KMS 鍵を使用して宛先テーブルのデータを暗号化する場合は、--destination_kms_key フラグを指定します。
  • 標準の SQL 構文を使用する場合は、--use_legacy_sql=false フラグを指定します。.bigqueryrc ファイルを使用して、コマンドライン ツールのデフォルト構文を設定できます。
  • クエリジョブに [KEY]:[VALUE] 形式のラベルを適用する場合は、--label フラグを指定します。複数のラベルを指定するには、このフラグを繰り返します。
  • クエリ結果で返される行数を指定する場合は、--max_rows または -n のフラグを指定します。
  • クエリに対して課金されるバイト数を制限する場合は、--maximum_bytes_billed フラグを指定します。クエリがこのフラグで設定した制限を超える場合、そのクエリは失敗します(料金は発生しません)。指定しない場合、課金されるバイトはプロジェクトのデフォルトに設定されます。
  • ユーザー定義の関数リソースとして使用するコードファイルを読み込み、評価する場合は、--udf_resource フラグを指定します。Cloud Storage の URI またはローカル コードファイルのパスを指定できます。複数のファイルを指定するには、このフラグを繰り返します。

標準 SQL 構文を使用してバッチクエリを実行するには、次のコマンドを入力します。

bq --location=[LOCATION] query --batch --use_legacy_sql=false '[QUERY]'

ここで

  • [LOCATION] は、クエリが処理されるロケーションの名前です。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
  • [QUERY] は標準 SQL 構文のクエリです。

例:

mydataset 内の mytable という名前の宛先テーブルにバッチクエリ結果を書き込むには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトにあります。このクエリは、USA Name データの一般公開データセットからデータを取得します。

bq --location=US query --batch --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 という名前の宛先テーブルにバッチクエリ結果を書き込むには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。このクエリは、分割されていないテーブル(USA Name データの一般公開データセット)からデータを取得します。

bq --location=US query --batch --destination_table myotherproject: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'

詳細については、bq コマンドライン ツールの使用をご覧ください。

API

API を使用してクエリを実行するには、新しいジョブを挿入して、jobs#configuration.query プロパティに値を入力します。ジョブリソースjobReference セクションにある location プロパティでロケーションを指定します。

クエリジョブのプロパティにデータを入力するときは、configuration.query.priority プロパティを含め、値を BATCH に設定します。

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")
	// Build an aggregate table.
	q := client.Query(`
		SELECT
  			corpus,
  			SUM(word_count) as total_words,
  			COUNT(1) as unique_words
		FROM ` + "`bigquery-public-data.samples.shakespeare`" + `
		GROUP BY corpus;`)
	q.Priority = bigquery.BatchPriority
	q.QueryConfig.Dst = client.Dataset(dstDatasetID).Table(dstTableID)

	// Start the job.
	job, err := q.Run(ctx)
	if err != nil {
		return err
	}
	// Job is started and will progress without interaction.
	// To simulate other work being done, sleep a few seconds.
	time.Sleep(5 * time.Second)
	status, err := job.Status(ctx)
	if err != nil {
		return err
	}

	state := "Unknown"
	switch status.State {
	case bigquery.Pending:
		state = "Pending"
	case bigquery.Running:
		state = "Running"
	case bigquery.Done:
		state = "Done"
	}
	// You can continue to monitor job progress until it reaches
	// the Done state by polling periodically.  In this example,
	// we print the latest status.
	fmt.Printf("Job %s in Location %s currently in state: %s\n", job.ID(), job.Location(), state)

Java

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

バッチクエリを実行するには、クエリの優先度の設定QueryJobConfiguration.Priority.BATCH に設定します。この操作は、QueryJobConfiguration の作成時に行います。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(query)
        // Run at batch priority, which won't count toward concurrent rate
        // limit.
        .setPriority(QueryJobConfiguration.Priority.BATCH)
        .build();

// Location must match that of the dataset(s) referenced in the query.
JobId jobId = JobId.newBuilder().setRandomJob().setLocation("US").build();
String jobIdString = jobId.getJob();

// API request - starts the query.
bigquery.create(JobInfo.newBuilder(queryConfig).setJobId(jobId).build());

// Check on the progress by getting the job's updated state. Once the state
// is `DONE`, the results are ready.
Job queryJob = bigquery.getJob(
    JobId.newBuilder().setJob(jobIdString).setLocation("US").build());
System.out.printf(
    "Job %s in location %s currently in state: %s%n",
    queryJob.getJobId().getJob(),
    queryJob.getJobId().getLocation(),
    queryJob.getStatus().getState().toString());

Python

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

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

job_config = bigquery.QueryJobConfig()
# Run at batch priority, which won't count toward concurrent rate limit.
job_config.priority = bigquery.QueryPriority.BATCH
sql = """
    SELECT corpus
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY corpus;
"""
# Location must match that of the dataset(s) referenced in the query.
location = 'US'

# API request - starts the query
query_job = client.query(sql, location=location, job_config=job_config)

# Check on the progress by getting the job's updated state. Once the state
# is `DONE`, the results are ready.
query_job = client.get_job(
    query_job.job_id, location=location)  # API request - fetches job
print('Job {} is currently in state {}'.format(
    query_job.job_id, query_job.state))

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

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

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