[BigQuery API(V2)] JavaでBigQueryでクエリを実行する

BigQuery API V2(Java)を使用して、
BigQueryでクエリを実行する方法
についてご紹介します。

クエリの実行には適切なIAM権限が付与されている必要があります。

権限付与に関しては
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(2.権限付与)](https://qiita.com/doran/items/8b7ba29672527426e88d#2-権限付与)
を参照ください。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[BigQuery API(V2)] JavaでBigQueryを使う](https://qiita.com/doran/items/8b7ba29672527426e88d)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[クエリを実行](#1-クエリを実行)|
||1|[スコープ](#11-スコープ)|
||2|[実行](#12-実行)|
||3|[レスポンスの内容](#13-レスポンスの内容)|

## 1. クエリを実行
BigQuery上でクエリを実行します。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
BigqueryScopes.DEVSTORAGE_READ_ONLY
https://www.googleapis.com/auth/cloud-platform.read-only
```
[⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)](https://qiita.com/doran/items/8b7ba29672527426e88d#32-bigqueryインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Jobs jobs = bigquery.jobs();
    
    QueryRequest request = new QueryRequest();
    request.setQuery("SELECT * FROM `プロジェクトID.データセットID.テーブルID` LIMIT 10");
    request.setUseLegacySql(false);
    
    Bigquery.Jobs.Query query = jobs.query("プロジェクトID",request);
    
    QueryResponse res = query.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/queries
が実行されます。

#### 1.2.2. クエリパラメータ
クエリパラメータはありまえん。

#### 1.2.3. リクエストボディ
QueryRequestのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setQuery|String|【必須】実行するクエリ文字列|
|setMaxResults|Integer|取得するデータの最大行数|
|setDefaultDataset|[DatasetReference](#datasetreference)|クエリ内の非修飾テーブル名として想定されるデフォルトの情報|
|setTimeoutMs|Integer|クライアントがクエリの完了を待機する最大時間(ミリ秒)|
|setDryRun|Boolean|ジョブを実行しないか|
|setUseQueryCache|Boolean|クエリキャッシュで結果を検索するか|
|setUseLegacySql|Boolean|BigQueryのレガシーSQL言語を使用するか|
|setParameterMode|String|パラメータモード(GoogleSQLのみ)|
|setQueryParameters|List\<[QueryParameter](#queryparameter)\>|jobs.queryパラメータ(GoogleSQLのみ)|
|setLocation|String|ジョブを実行するロケーション|
|setFormatOptions|[DataFormatOptions](#dataformatoptions)|出力フォーマットの調整|
|setConnectionProperties|List\<[ConnectionProperty](#connectionproperty)|クエリの動作を変更できる接続プロパティ|
|setLabels|Map\<String,String\>|クエリに関連付けられたラベル|
|setMaximumBytesBilled|Long|クエリに対して請求されるバイト数の制限|
|setRequestId|String|ユーザーが指定した一意の識別子|
|setCreateSession|Boolean|ランダムに生成されたsessionIdを使用して新しいセッションを作成するか|

#### DatasetReference
|メソッド|引数|説明|
|---|---|---|
|setDatasetId|String|データセットID|
|setProjectId|String|プロジェクトID|

#### QueryParameter
|メソッド|引数|説明|
|---|---|---|
|setName|String|パラメータ名|
|setParameterType|[QueryParameterType](#queryparametertype)|パラメータのタイプ|
|setParameterValue|[QueryParameterValue](#queryparametervalue)|パラメータの値|

#### QueryParameterType
|メソッド|引数|説明|
|---|---|---|
|setType|String|トップレベルのタイプ|
|setArrayType|[QueryParameterType](#queryparametertype)|配列の要素の型|
|setStructTypes|List\<[QueryParameterType.StructTypes](#queryparametertypestructtypes)|構造体のフィールドの型|
|setRangeElementType|[QueryParameterType](#queryparametertype)|範囲の要素タイプ|

#### QueryParameterType.StructTypes
|メソッド|引数|説明|
|---|---|---|
|setName|String|フィールドの名前|
|setType|[QueryParameterType](#queryparametertype)|フィールドのタイプ|
|setDescription|String|フィールドの説明|

#### QueryParameterValue
|メソッド|引数|説明|
|---|---|---|
|setValue|String|値|
|setArrayValues|List\<[QueryParameterValue](#queryparametervalue)\>|配列値|
|setStructValues|Map\<String,[QueryParameterValue](#queryparametervalue)\>|構造体のフィールド値|
|setRangeValue|[RangeValue](#rangevalue)|範囲の​​値|

#### RangeValue
|メソッド|引数|説明|
|---|---|---|
|setStart|[QueryParameterValue](#queryparametervalue)|範囲の開始値|
|setEnd|[QueryParameterValue](#queryparametervalue)|範囲の終了値|

#### DataFormatOptions
|メソッド|引数|説明|
|---|---|---|
|setUseInt64Timestamp|Boolean|タイムスタンプをusec int64として出力するか|

#### ConnectionProperty
|メソッド|引数|説明|
|---|---|---|
|setKey|String|プロパティのキー|
|setValue|String|プロパティの値|

### 1.3. レスポンスの内容
#### QueryResponse
|メソッド|戻り値|説明|
|---|---|---|
|getKind|String|リソースの種類<br>固定文字列："bigquery#queryResponse"|
|getPageToken|String|次ページのトークン|
|getSchema|[⧉TableSchema](https://qiita.com/doran/items/57468203da657921fa2d#tableschema)|結果のスキーマ|
|getJobReference|[JobReference](#jobreference)|クエリを実行するために作成されたジョブへの参照|
|getTotalRows|BigInteger|クエリ結果セットの合計行数|
|getRows|List\<[TableRow](#tablerow)\>|クエリの実行結果|
|getTotalBytesProcessed|Long|処理された合計バイト数|
|getJobComplete|Boolean|クエリが完了したか|
|getErrors|List\<[ErrorProto](#errorproto)\>|ジョブの実行中に発生した最初のエラー|
|getCacheHit|Boolean|クエリ結果がクエリ キャッシュからフェッチされたか|
|getNumDmlAffectedRows|Long|DMLステートメントの影響を受ける行の数|
|getSessionInfo|[SessionInfo](#sessioninfo)|セッションの情報|
|getDmlStats|[DmlStats](#dmlstats)|DMLステートメントの詳細な統計|

#### JobReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|
|getJobId|String|ジョブID|
|getLocation|String|ロケーション|

#### TableRow
|メソッド|戻り値|説明|
|---|---|---|
|get("フィールド名")|Object|引数で指定したフィールド名の値|

#### ErrorProto
|メソッド|戻り値|説明|
|---|---|---|
|getReason|String|エラーコード|
|getLocation|String|エラーが発生した場所|
|getDebugInfo|String|デバッグ情報|
|getMessage|String|エラーの説明|

#### SessionInfo
|メソッド|戻り値|説明|
|---|---|---|
|getSessionId|String|セッションID|

#### DmlStats
|メソッド|戻り値|説明|
|---|---|---|
|getInsertedRowCount|Long|挿入された行の数|
|getDeletedRowCount|Long|削除された行の数|
|getUpdatedRowCount|Long|更新された行の数|

<br>
<br>
おしまい。。