[BigQuery API(V2)] Javaでデータセットを生成・更新・削除する

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-レスポンスの内容)|
|2||[データセットを上書き](#2-データセットを上書き)|
||1|[スコープ](#21-スコープ)|
||2|[実行](#22-実行)|
||3|[レスポンスの内容](#23-レスポンスの内容)|
|3||[データセットを更新](#3-データセットを更新)|
||1|[スコープ](#31-スコープ)|
||2|[実行](#32-実行)|
||3|[レスポンスの内容](#33-レスポンスの内容)|
|4||[データセットを削除](#4-データセットを削除)|
||1|[スコープ](#41-スコープ)|
||2|[実行](#42-実行)|
||3|[レスポンスの内容](#43-レスポンスの内容)|

## 1. データセットを生成
指定したプロジェクトにデータセットを生成します。

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

### 1.2. 実行
作成するデータセットIDの設定は必須です。

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Datasets datasets = bigquery.datasets();
    
    Dataset content = new Dataset();
    content.setDatasetReference(new DatasetReference().setDatasetId("データセットID"));
    Bigquery.Datasets.Insert insert = datasets.insert("プロジェクトID",content);
    
    Dataset res = insert.execute();
    System.out.println(res);
}
```
#### 1.2.1. HTTPリクエスト
POST:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets
が実行されます。

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

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

|メソッド|引数|説明|
|---|---|---|
|setDatasetReference|[DatasetReference](#datasetreferenceset)|【生成時のみ必須】データセット参照|
|setLocation|String|データセットのロケーション|
|setLabels|Map\<String,String\>|このデータセットに関連付けられたラベル|
|setFriendlyName|String|データセットの代替名|
|setDescription|String|データセットのわかりやすい説明|
|setDefaultTableExpirationMs|Long|データセット内のすべてのテーブルのデフォルトの存続期間(ミリ秒)|
|setDefaultPartitionExpirationMs|Long|デフォルトのパーティションの有効期限(ミリ秒)|
|setAccess|List\<[Dataset.Access](#datasetaccessset)\>|エンティティのデータセット|
|setDefaultEncryptionConfiguration|[EncryptionConfiguration](#encryptionconfigurationset)|データセット内のすべてのテーブルのデフォルトの暗号化キー|
|setLinkedDatasetSource|[LinkedDatasetSource](#linkeddatasetsourceset)|【getType()がLINKEDの場合】<br>データセット参照|
|setExternalDatasetReference|[ExternalDatasetReference](#externaldatasetreferenceset)|【getType()がEXTERNALの場合】<br>データセット参照|
|setIsCaseInsensitive|Boolean|データセットとそのテーブル名が大文字と小文字を区別しないか|
|setDefaultCollation|String|データセット内に今後作成されるテーブルのデフォルトの照合仕様<br>"und:ci"(ロケールは不明、文字の大小区別なし)、""(空の文字列。文字の大小区別あり)|
|setDefaultRoundingMode|[RoundingMode(enum)](#roundingmode)|このデータセット内で作成される新しいテーブルのデフォルトの丸めモード仕様|
|setMaxTimeTravelHours|Long|タイムトラベルウィンドウの定義(時間)|
|setStorageBillingModel|[StorageBillingModel(enum)](#storagebillingmodel)|課金モデル|

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

#### Dataset.Access(Set)
|メソッド|引数|説明|
|---|---|---|
|setRole|String|IAMロールID|
|setUserByEmail|String|アクセス許可するメールアドレス(サービスアカウントメールアドレス or OAuth2.0認証を行うメールアドレス)|
|setGroupByEmail|String|アクセス許可するグループのメールアドレス|
|setDomain|String|アクセス許可するドメイン|
|setSpecialGroup|String|アクセス許可する特別なグループ|
|setIamMember|String|IAMポリシーに表示されるユーザー、グループ、ドメイン、または特別なグループではない他のタイプのメンバー|
|setView|[TableReference](#tablereferenceset)|アクセスを許可する別のデータセットからのビュー|
|setRoutine|[RoutineReference](#routinereferenceset)|アクセスを許可する別のデータセットのルーティン|
|setDataset|[DatasetAccessEntry](#datasetaccessentryset)|データセットへの読み取りアクセス許可|

#### TableReference(Set)
|メソッド|引数|説明|
|---|---|---|
|setProjectId|String|プロジェクトID|
|setDatasetId|String|データセットID|
|setTableId|String|テーブルID|

#### RoutineReference(Set)
|メソッド|引数|説明|
|---|---|---|
|setProjectId|String|プロジェクトID|
|setDatasetId|String|データセットID|
|setRoutineId|String|ルーティンID|

#### DatasetAccessEntry(Set)
|メソッド|引数|説明|
|---|---|---|
|setDataset|[DatasetReference](#datasetreferenceset)|このエントリが適用されるデータセット
|setTargetTypes|List\<[TargetType(enum)](#targettype)\>|このエントリが適用されるデータセット内のリソース|

#### EncryptionConfiguration(Set)
|メソッド|引数|説明|
|---|---|---|
|setKmsKeyName|String|CloudKMS暗号化キー|

#### LinkedDatasetSource(Set)
|メソッド|引数|説明|
|---|---|---|
|setSourceDataset|[DatasetReference](#datasetreferenceset)|ソースデータセット参照|

#### ExternalDatasetReference(Set)
|メソッド|引数|説明|
|---|---|---|
|setExternalSource|String|このデータセットを裏付ける外部ソース|
|setConnection|String|externalSourceへのアクセスに使用される接続ID|

### 1.3. レスポンスの内容
#### Dataset
|メソッド|戻り値|説明|
|---|---|---|
|getId|String|プロジェクト名を含むデータセットID<br>形式：「プロジェクト名:データセットID」|
|getEtag|String|結果ページのハッシュ値|
|getKind|String|リソースの種類<br>固定文字列："bigquery#dataset"|
|getLocation|String|データセットのロケーション|
|getSelfLink|String|リソースにアクセスするために使用できるURL|
|getLabels|Map\<String,String\>|このデータセットに関連付けられたラベル|
|getDatasetReference|[DatasetReference](#datasetreference)|データセット参照|
|getFriendlyName|String|データセットの代替名|
|getDescription|String|データセットのわかりやすい説明|
|getType|String|[データセットのタイプ](#データセットのタイプ)|
|getDefaultTableExpirationMs|Long|データセット内のすべてのテーブルのデフォルトの存続期間(ミリ秒)|
|getDefaultPartitionExpirationMs|Long|デフォルトのパーティションの有効期限(ミリ秒)|
|getAccess|List\<[Dataset.Access](#datasetaccess)\>|エンティティのデータセット|
|getCreationTime|Long|データセットが作成された時刻(ミリ秒)|
|getLastModifiedTime|Long|データセットが最後に変更された日付(ミリ秒)|
|getDefaultEncryptionConfiguration|[EncryptionConfiguration](#encryptionconfiguration)|データセット内のすべてのテーブルのデフォルトの暗号化キー|
|getLinkedDatasetSource|[LinkedDatasetSource](#linkeddatasetsource)|【getType()がLINKEDの場合】<br>データセット参照|
|getExternalDatasetReference|[ExternalDatasetReference](#externaldatasetreference)|【getType()がEXTERNALの場合】<br>データセット参照|
|getIsCaseInsensitive|Boolean|データセットとそのテーブル名が大文字と小文字を区別しないか|
|getDefaultCollation|String|データセット内に今後作成されるテーブルのデフォルトの照合仕様<br>"und:ci"(ロケールは不明、文字の大小区別なし)、""(空の文字列。文字の大小区別あり)|
|getDefaultRoundingMode|[RoundingMode(enum)](#roundingmode)|このデータセット内で作成される新しいテーブルのデフォルトの丸めモード仕様|
|getMaxTimeTravelHours|Long|タイムトラベルウィンドウの定義(時間)|
|getTags|List\<[Dataset.Tags](#datasettags)\>|データセットのタグ|
|getStorageBillingModel|[StorageBillingModel(enum)](#storagebillingmodel)|課金モデル|

#### DatasetReference
|メソッド|戻り値|説明|
|---|---|---|
|getDatasetId|String|データセットID|
|getProjectId|String|プロジェクトID|

#### Dataset.Access
|メソッド|戻り値|説明|
|---|---|---|
|getRole|String|IAMロールID|
|getUserByEmail|String|アクセス許可するメールアドレス(サービスアカウントメールアドレス or OAuth2.0認証を行うメールアドレス)|
|getGroupByEmail|String|アクセス許可するグループのメールアドレス|
|getDomain|String|アクセス許可するドメイン|
|getSpecialGroup|String|アクセス許可する特別なグループ|
|getIamMember|String|IAMポリシーに表示されるユーザー、グループ、ドメイン、または特別なグループではない他のタイプのメンバー|
|getView|[TableReference](#tablereference)|アクセスを許可する別のデータセットからのビュー|
|getRoutine|[RoutineReference](#routinereference)|アクセスを許可する別のデータセットのルーティン|
|getDataset|[DatasetAccessEntry](#datasetaccessentry)|データセットへの読み取りアクセス許可|

#### TableReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|
|getDatasetId|String|データセットID|
|getTableId|String|テーブルID|

#### RoutineReference
|メソッド|戻り値|説明|
|---|---|---|
|getProjectId|String|プロジェクトID|
|getDatasetId|String|データセットID|
|getRoutineId|String|ルーティンID|

#### DatasetAccessEntry
|メソッド|戻り値|説明|
|---|---|---|
|getDataset|[DatasetReference](#datasetreference)|このエントリが適用されるデータセット
|getTargetTypes|List\<[TargetType(enum)](#targettype)\>|このエントリが適用されるデータセット内のリソース|

#### Dataset.Tags
|メソッド|戻り値|説明|
|---|---|---|
|getTagKey|String|タグキーの名前空間付きフレンドリ名|
|getTagValue|String|タグ値の短縮名|

#### EncryptionConfiguration
|メソッド|戻り値|説明|
|---|---|---|
|getKmsKeyName|String|CloudKMS暗号化キー|

#### LinkedDatasetSource
|メソッド|戻り値|説明|
|---|---|---|
|getSourceDataset|[DatasetReference](#datasetreference)|ソースデータセット参照|

#### ExternalDatasetReference
|メソッド|戻り値|説明|
|---|---|---|
|getExternalSource|String|このデータセットを裏付ける外部ソース|
|getConnection|String|externalSourceへのアクセスに使用される接続ID|

#### RoundingMode
|定義値|内容|
|---|---|
|ROUNDING_MODE_UNSPECIFIED|設定なし|
|ROUND_HALF_AWAY_FROM_ZERO|NUMERIC値とBIGNUMERIC値の書き込み時に精度と位取りを適用するときに、半分の値をゼロから四捨五入する|
|ROUND_HALF_EVEN|NUMERIC値とBIGNUMERIC値の書き込み時に精度と位取りを適用するときに、半分の値を最も近い偶数値に丸める|

#### StorageBillingModel
|定義値|内容|
|---|---|
|STORAGE_BILLING_MODEL_UNSPECIFIED|設定なし|
|LOGICAL|論理バイトに対する課金|
|PHYSICAL|物理バイトに対する課金|

#### TargetType
|定義値|内容|
|---|---|
|TARGET_TYPE_UNSPECIFIED|未使用(使用不可)|
|VIEWS|このエントリはデータセット内のビューに適用|

#### データセットのタイプ
|定義値|内容|
|---|---|
|DEFAULT|所有者と承認されたアカウントのみがアクセス可能なデータセット|
|PUBLIC|誰でもアクセス可能なデータセット|
|LINKED|リンクされたデータセット|
|EXTERNAL|外部メタデータカタログに定義されているデータセット|

## 2. データセットを上書き
指定したデータセットを上書きします。

[3. データセットを更新](#3-データセットを更新)と違うところは、
指定した存在するデータセットを新しいデータセットに置き換えます。
置き換えなので値を設定していないメタデータも更新されます。

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

### 2.2. 実行
```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Datasets datasets = bigquery.datasets();
    
    Dataset content = new Dataset();
    //上書き内容を設定
    
    Bigquery.Datasets.Update update = datasets.update("プロジェクトID","データセットID",content);
    
    Dataset res = update.execute();
    System.out.println(res);
}
```
#### 2.2.1. HTTPリクエスト
PUT:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}
が実行されます。

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

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

[1.2.2. リクエストボディ](#122-リクエストボディ)と同じです。

### 2.3. レスポンスの内容
#### Dataset

[1.3. レスポンスの内容(Dataset)](#dataset)と同じです。

## 3. データセットを更新
指定したデータセットを更新します。

[2. データセットを上書き](#2-データセットを上書き)と違うところは、
指定した存在するデータセットのメタデータを設定した内容に更新します。
上書きとは異なり設定したメタデータのみ更新されます。

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

### 3.2. 実行
```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Datasets datasets = bigquery.datasets();
    
    Dataset content = new Dataset();
    //更新内容を設定
    
    Bigquery.Datasets.Patch patch = datasets.patch("プロジェクトID","データセットID",content);
    
    Dataset res = patch.execute();
    System.out.println(res);
}
```
#### 3.2.1. HTTPリクエスト
PATCH:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}
が実行されます。

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

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

[1.2.2. リクエストボディ](#122-リクエストボディ)と同じです。

### 3.3. レスポンスの内容
#### Dataset

[1.3. レスポンスの内容(Dataset)](#dataset)と同じです。

## 4. データセットを削除
指定したデータセットを削除します。

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

### 4.2. 実行

```java
public static void main(String[] args) throws Exception{
    Bigquery bigquery = getBigquery();
    Bigquery.Datasets datasets = bigquery.datasets();
    
    Bigquery.Datasets.Delete delete = datasets.delete("プロジェクトID","データセットID");
    delete.setDeleteContents(true);
    
    delete.execute();
}
```
#### 4.2.1. HTTPリクエスト
DELETE:　https:\//bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}
が実行されます。

#### 4.2.2. クエリパラメータ
Bigquery.Datasets.Deleteのsetメソッドにより、リクエストボディを追加できます。

|メソッド|引数|説明|
|---|---|---|
|setDeleteContents|Boolean|データセット内のテーブルも削除するか<br><br>falseの場合、データセット内にテーブルが存在すると例外が出力されます|

#### 4.2.3. リクエストボディ
リクエストボディはありません。

### 4.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合は例外が発生します。

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