ページ分けを使用して BigQuery API でデータを読み取る
このドキュメントでは、BigQuery API でページ分けを使用してテーブルデータとクエリ結果を読み取る方法について説明します。
API を使用して結果をページ分割する
すべての *collection*.list
メソッドから返される結果は、特定の状況においてページ分割されます。maxResults
プロパティは、ページあたりの結果の数を制限します。
メソッド | ページ分け基準 | maxResults のデフォルト値 |
maxResults の最大値 |
maxFieldValues の最大値 |
---|---|---|---|---|
tabledata.list |
レスポンス サイズが 10 MB1 を超えるデータ、または maxResults 行を超える場合は、ページ分割された結果を返します。 |
無制限 | 無制限 | 無制限 |
その他すべての *collection*.list メソッド |
レスポンスが maxResults 行を超え、かつ上限を下回っている場合は、ページ分割された結果を返します。 |
10,000 | 無制限 | 300,000 |
結果がバイトまたはフィールドの上限を超えると、結果は上限に合わせてカットされます。1 行がバイトまたはフィールドの上限より大きい場合、tabledata.list
は最大 100 MB のデータ1を返すことができます。これは、クエリ結果の最大行数制限に準拠しています。ページあたりの最小サイズはなく、一部のページは他のページよりも多くの行を返すことがあります。
1 行サイズは行データの内部表現に基づくため、概算値です。行の最大サイズに対する上限は、クエリジョブ実行の特定の段階で適用されます。
jobs.getQueryResults
は、サポートを通じてより大きなデータサイズを明示的にリクエストした場合を除いて、20 MB のデータを返すことができます。
ページは全行数のサブセットです。結果が 1 ページ分のデータを超える場合、結果データには pageToken
プロパティが含まれます。次のページの結果を取得するには、別の list
呼び出しを行い、トークン値を pageToken
という名前の URL パラメータとして指定します。
テーブルデータのページ分けに使用する tabledata.list
メソッドでは、行オフセット値またはページトークンを使用します。詳しくは、テーブルデータの閲覧をご覧ください。
クライアント ライブラリの結果を反復処理する
Cloud クライアント ライブラリは API のページ分けの低レベルの詳細を処理し、ページ レスポンス内の個々の要素の操作を簡素化する、よりイテレータに似たエクスペリエンスを提供します。
BigQuery テーブルデータをページ分割するサンプルを以下に示します。
C#
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある C# の設定手順を完了してください。詳細については、BigQuery C# API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Go
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Go 用の Cloud クライアント ライブラリでは、デフォルトで自動的にページ分けされるため、ページ分けを自分で実装する必要はありません。次に例を示します。
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Node.js 用の Cloud クライアント ライブラリでは、デフォルトで自動的にページ分けされるため、ページ分けを自分で実装する必要はありません。次に例を示します
PHP
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある PHP の設定手順を完了してください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
PHP 用の Cloud クライアント ライブラリでジェネレータ関数 rows
を使用すると、ページ分けが自動的に行われます。この関数はイテレーション中に結果の次のページをフェッチします。
Python
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python 用の Cloud クライアント ライブラリでは、デフォルトで自動的にページ分けされるため、ページ分けを自分で実装する必要はありません。次に例を示します。
Ruby
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Ruby の設定手順を完了してください。詳細については、BigQuery Ruby API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Ruby 用 Cloud クライアント ライブラリで Table#data
と Data#next
を使用すると、ページ分けが自動的に行われます。
任意のページをリクエストして、冗長リスト呼び出しを回避する
前のページに戻る場合、またはキャッシュに保存された pageToken
の値を使用して任意のページにジャンプする場合、ページのデータが最後に表示された後で変更されている可能性がありますが、データが変更されたことは明確には示されません。これを確認するには、etag
プロパティを使用できます。
すべての collection.list
メソッド(テーブルデータ用を除く)は、結果で etag
プロパティを返します。このプロパティは、ページが最後のリクエスト以降に変更されているかどうかを確認するために使用できるページ結果のハッシュです。ETag 値を使用して BigQuery にリクエストを行うと、BigQuery はその ETag 値と API によって返された ETag 値を比較し、ETag 値が一致しているかどうかに基づいて応答します。ETag を次のように使用して冗長リスト呼び出しを回避できます。
値が変更されている場合にリスト値を返す。
値が変更されている場合にのみリスト値のページを返す場合は、HTTP の If-None-Match ヘッダーを使用し、保存しておいた ETag を指定してリスト呼び出しを行うことができます。指定した ETag がサーバー上の ETag と一致しない場合、BigQuery は、新しいリスト値のページを返します。ETag が一致する場合、BigQuery は
HTTP 304 Not Modified
ステータスを返し、値を返しません。この例として、ユーザーが BigQuery に格納されている情報を定期的に入力するウェブページがあります。ETag と If-None-Match ヘッダーを使用することにより、データに変更がない場合に冗長なリスト呼び出しを避けることができます。値が変更されていない場合にリスト値を返す。
リストの値が変更されていない場合にのみリスト値のページを返す場合は、HTTP の If-Match ヘッダーを使用できます。BigQuery は ETag 値を比較し、結果が変更されていない場合は結果のページを返します。ページが変更されている場合は、412「Precondition Failed」という結果を返します。
クエリ結果をページ分割する
各クエリは宛先テーブルに書き込みます。宛先テーブルが指定されていない場合、BigQuery API は宛先テーブル プロパティに一時匿名テーブルへの参照を自動的に挿入します。
API
jobs.config.query.destinationTable
フィールドを読み取り、クエリ結果が書き込まれたテーブルを確認します。クエリ結果を読み取るには、tabledata.list
を呼び出します。
Java
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
各ページで返される行数を設定するには、GetQueryResults
ジョブを使用し、渡す QueryResultsOption
オブジェクトの pageSize
オプションを設定します。次の例をご覧ください。
TableResult result = job.getQueryResults();
QueryResultsOption queryResultsOption = QueryResultsOption.pageSize(20);
TableResult result = job.getQueryResults(queryResultsOption);
Node.js
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。
Python
QueryJob.result
メソッドは、クエリ結果のイテラブルを返します。または
QueryJob.destination
プロパティを読み取ります。このプロパティが構成されていない場合は、API によって一時匿名テーブルへの参照が設定されます。Client.get_table
メソッドでテーブル スキーマを取得します。Client.list_rows
メソッドを使用して、宛先テーブルのすべての行に対するイテラブルを作成します。
このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。