BigQuery API V2(Java)を使用して、
BigQueryデータセットのルーティンを生成・更新・削除する方法
についてご紹介します。
ルーティンとは
処理を事前に定義しておいて、後から呼び出せるようにしておくためのコンポーネントです。
BigQueryでは、以下のリソースをルーティンと定義付けています。
| リソース | 概要 |
|---|---|
| リモート関数を含むユーザー定義関数(UDF) | SQL または JavaScript で記述するステートメント群 |
| ストアドプロシージャ | SQLで記述するステートメント群 |
| テーブル関数(TFV) | 戻り値にテーブルを返すユーザー定義関数 |
データセットのルーティンを生成・更新・削除するには、
データセットに対し適切なIAM権限が付与されている必要があります。
権限付与に関しては
⧉[BigQuery API(V2)] JavaでBigQueryを使う(2.権限付与)
を参照ください。
APIを利用する環境の準備から始める場合や、コードを実行する際は、
⧉[BigQuery API(V2)] JavaでBigQueryを使う
を参照ください。
| No | 目次 | |
|---|---|---|
| 1 | ルーティンを生成 | |
| 1 | スコープ | |
| 2 | 実行 | |
| 3 | レスポンスの内容 | |
| 2 | ルーティンを更新 | |
| 1 | スコープ | |
| 2 | 実行 | |
| 3 | レスポンスの内容 | |
| 3 | ルーティンを削除 | |
| 1 | スコープ | |
| 2 | 実行 | |
| 3 | レスポンスの内容 |
1. ルーティンを生成
指定したデータセットにルーティンを作成します。
1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)
でスコープを指定してください。
1.2. 実行
APIを通すことが目的なのでルーティンについての説明はここでは省きます。
プロジェクトIDとデータセットIDは2度ずつ設定していますが、
設定しないとエラーになります。
public static void main(String[] args) throws Exception{
Bigquery bigquery = getBigquery();
Bigquery.Routines routines = bigquery.routines();
RoutineReference reference = new RoutineReference();
reference.setProjectId("プロジェクトID");
reference.setDatasetId("データセットID");
reference.setRoutineId("これから生成するルーティンID");
Routine content = new Routine();
content.setRoutineReference(reference);
content.setRoutineType("SCALAR_FUNCTION");
content.setDefinitionBody("x * 3");
Argument argument = new Argument();
argument.setName("test");
argument.setArgumentKind("ANY_TYPE");
content.setArguments(Arrays.asList(argument));
Bigquery.Routines.Insert insert = routines.insert("プロジェクトID","データセットID",content);
Routine res = insert.execute();
System.out.println(res);
}
1.2.1. HTTPリクエスト
POST: https://bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/routines
が実行されます。
1.2.2. クエリパラメータ
クエリパラメータはありません。
1.2.3. リクエストボディ
Routineのsetメソッドにより、リクエストボディを追加できます。
| メソッド | 引数 | 説明 |
|---|---|---|
| setRoutineReference | RoutineReference | 【必須】ルーティンのリファレンス |
| setRoutineType | RoutineType(enum) | 【必須】ルーティンの種類 |
| setDefinitionBody | String | 【必須】ルーティンの本体 【routineType="TABLE_VALUED_FUNCTION"の場合】AS句の式 【language="SQL"の場合】括弧内の部分文字列 【language="JAVASCRIPT"の場合】AS句で評価される文字列 |
| setLanguage | Language(enum) | ルーティンの言語 remoteFunctionOptionsの設定がない場合は"SQL"で固定。"SQL"以外にする場合は、remoteFunctionOptionsの設定が必須 |
| setArguments | List<Argument> | 引数情報 |
| setReturnType | StandardSqlDataType | 【language!="SQL"の場合は必須】 ルーティンのデータ型情報 |
| setReturnTableType | StandardSqlTableType | ルーティンタイプ情報 |
| setImportedLibraries | List<String> | インポートされたJavaScriptライブラリのパス |
| setDescription | String | ルーティンの説明 |
| setDeterminismLevel | DeterminismLevel(enum) | JavaScriptUDFの決定レベル |
| setStrictMode | Boolean | 多くの一般的なエラーを検出するか |
| setRemoteFunctionOptions | RemoteFunctionOptions | リモート機能固有のオプション |
| setSparkOptions | SparkOptions | Spark固有のオプション |
| setDataGovernanceType | DataGovernanceType(enum) | データガバナンスタイプ |
RoutineReference
| メソッド | 引数 | 説明 |
|---|---|---|
| setProjectId | String | 【必須】プロジェクトID |
| setDatasetId | String | 【必須】データセットID |
| setRoutineId | String | 【必須】ルーティンID |
Argument
| メソッド | 引数 | 説明 |
|---|---|---|
| setName | String | 引数の名前 |
| setArgumentKind | ArgumentKind(enum) | 引数の種類 |
| setMode | Mode(enum) | 引数の入出力モード |
| setDataType | StandardSqlDataType | 【argumentKind!="ANY_TYPE"の場合は必須】 引数のデータ型情報 |
StandardSqlTableType
| メソッド | 引数 | 説明 |
|---|---|---|
| setColumns | List<StandardSqlField> | このテーブルの列の種類 |
RemoteFunctionOptions
| メソッド | 引数 | 説明 |
|---|---|---|
| setEndpoint | String | ユーザー提供のリモートサービスのエンドポイント |
| setConnection | String | リモートサービスにリクエストを送信するための認証情報を保持するユーザー指定の接続オブジェクトの完全修飾名 |
| setUserDefinedContext | Map<String,String> | ユーザー定義コンテキスト |
| setMaxBatchingRows | Long | リモートサービスに送信される各バッチの最大行数 |
SparkOptions
| メソッド | 引数 | 説明 |
|---|---|---|
| setConnection | String | Spark接続オブジェクトの完全修飾名 |
| setRuntimeVersion | String | ランタイムバージョン |
| setContainerImage | String | ランタイム環境のカスタムコンテナーイメージ |
| setProperties | Map<String,String> | 構成プロパティ |
| setMainFileUri | String | SparkアプリケーションのメインファイルURI |
| setPyFileUris | List<String> | PySparkアプリケーションのPYTHONPATHに配置されるPythonファイル |
| setJarUris | List<String> | ドライバーおよびエグゼキューターのCLASSPATHに含めるJARファイル |
| setFileUris | List<String> | 各エグゼキュータの作業ディレクトリに配置されるファイル |
| setArchiveUris | List<String> | 各エグゼキュータの作業ディレクトリに抽出されるアーカイブファイル |
| setMainClass | String | jarUris内のクラスの完全修飾名 |
StandardSqlField
| メソッド | 引数 | 説明 |
|---|---|---|
| setName | String | 名前 |
| setType | StandardSqlDataType | パラメータのタイプ |
StandardSqlDataType
| メソッド | 引数 | 説明 |
|---|---|---|
| setTypeKind | TypeKind(enum) | 【必須】トップレベルのタイプ |
| setArrayElementType | StandardSqlDataType | 【getTypeKind()が"ARRAY"の場合】 配列の要素の型 |
| setStructType | StandardSqlStructType | 【getTypeKind()が"STRUCT"の場合】 構造体のフィールド |
StandardSqlStructType
| メソッド | 引数 | 説明 |
|---|---|---|
| setFields | List<StandardSqlField> | 構造体のフィールド |
TypeKind
| 定義値 | 内容 |
|---|---|
| TYPE_KIND_UNSPECIFIED | 無効なタイプ |
| STRING | 文字列 |
| BYTES | バイト(base64文字列としてエンコード) |
| INT64 | 8byte整数(10進数の文字列としてエンコード) |
| NUMERIC | 16byte整数(10進数の文字列としてエンコード) |
| BIGNUMERIC | 32byte整数(10進数の文字列としてエンコード) |
| BOOL | 真偽値 |
| FLOAT64 | 浮動小数点数(数値または文字列「NaN」、「Infinity」、「-Infinity」としてエンコード |
| TIMESTAMP | タイムスタンプ |
| DATE | 日付 |
| TIME | 時間 |
| DATETIME | 日付時刻 |
| GEOGRAPHY | 地理空間データ(WKTとしてエンコード) |
| ARRAY | 配列型(Type.array_typeと一致するタイプのリストとしてエンコード) |
| STRUCT | 構造体型(Type.struct_type[i]型のフィールドを持つリストとしてエンコード) |
| JSON | JSON文字列(tabledata.listが使用) |
RoutineType
| 定義値 | 内容 |
|---|---|
| ROUTINE_TYPE_UNSPECIFIED | デフォルト値 |
| SCALAR_FUNCTION | リモート関数を含むユーザー定義関数(UDF) |
| PROCEDURE | ストアドプロシージャ |
| TABLE_VALUED_FUNCTION | テーブル関数 |
Language
| 定義値 | 内容 |
|---|---|
| LANGUAGE_UNSPECIFIED | デフォルト値 |
| SQL | SQL言語 |
| JAVASCRIPT | JavaScript言語 |
| PYTHON | Python言語 |
| JAVA | Java言語 |
| SCALA | スカラ言語 |
ArgumentKind
| 定義値 | 内容 |
|---|---|
| ARGUMENT_KIND_UNSPECIFIED | デフォルト値 |
| FIXED_TYPE | 引数は完全に指定された型の変数 |
| ANY_TYPE | 引数は構造体や配列を含む任意の型 |
Mode
| 定義値 | 内容 |
|---|---|
| MODE_UNSPECIFIED | デフォルト値 |
| IN | 引数は入力専用 |
| OUT | 引数は出力専用 |
| INOUT | 引数は入力でもあり出力でもある |
DeterminismLevel
| 定義値 | 内容 |
|---|---|
| DETERMINISM_LEVEL_UNSPECIFIED | 未指定 |
| DETERMINISTIC | UDFは決定的 |
| NOT_DETERMINISTIC | UDFは決定論的ではない |
DataGovernanceType
| 定義値 | 内容 |
|---|---|
| DATA_GOVERNANCE_TYPE_UNSPECIFIED | 未指定 |
| DATA_MASKING | データマスキング |
1.3. レスポンスの内容
Routine
⧉[BigQuery API(V2)] Javaでデータセットのルーティン情報を取得する(Routine)
と同じです。
2. ルーティンを更新
指定したルーティンを更新します。
2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)
でスコープを指定してください。
2.2. 実行
ルーティンIDは、RoutineReferenceのgetRoutineId()で取得できる値を使用します。
⧉[BigQuery API(V2)] Javaでデータセットのルーティン情報を取得する(RoutineReference)
を参照ください。
必須項目はルーティン生成時と同じです。
プロジェクトIDとデータセットID、ルーティンIDは2度ずつ設定していますが、
設定しないとエラーになります。
public static void main(String[] args) throws Exception{
Bigquery bigquery = getBigquery();
Bigquery.Routines routines = bigquery.routines();
RoutineReference reference = new RoutineReference();
reference.setProjectId("プロジェクトID");
reference.setDatasetId("データセットID");
reference.setRoutineId("ルーティンID");
Routine content = new Routine();
content.setRoutineReference(reference);
content.setRoutineType("SCALAR_FUNCTION");
content.setDefinitionBody("x * 10"); //ここだけを変えました
Argument argument = new Argument();
argument.setName("test");
argument.setArgumentKind("ANY_TYPE");
content.setArguments(Arrays.asList(argument));
Bigquery.Routines.Update update = routines.update("プロジェクトID","データセットID","ルーティンID",content);
Routine res = update.execute();
System.out.println(res);
}
2.2.1. HTTPリクエスト
PUT: https://bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/routines/{ルーティンID}
が実行されます。
2.2.2. クエリパラメータ
リクエストパラメータはありません。
2.2.3. リクエストボディ
Routineのsetメソッドにより、リクエストボディを追加できます。
1.2.3. リクエストボディと同じです。
2.3. レスポンスの内容
Routine
⧉[BigQuery API(V2)] Javaでデータセットのルーティン情報を取得する(Routine)
と同じです。
3. ルーティンを削除
指定したルーティンを削除します。
3.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
BigqueryScopes.BIGQUERY
BigqueryScopes.CLOUD_PLATFORM
⧉[BigQuery API(V2)] JavaでBigQueryを使う(3.2. BigQueryインスタンスを取得)
でスコープを指定してください。
3.2. 実行
ルーティンIDは、RoutineReferenceのgetRoutineId()で取得できる値を使用します。
⧉[BigQuery API(V2)] Javaでデータセットのルーティン情報を取得する(RoutineReference)
を参照ください。
public static void main(String[] args) throws Exception{
Bigquery bigquery = getBigquery();
Bigquery.Routines routines = bigquery.routines();
Bigquery.Routines.Delete delete = routines.delete("プロジェクトID","データセットID","ルーティンID");
delete.execute();
}
3.2.1. HTTPリクエスト
DELETE: https://bigquery.googleapis.com/bigquery/v2/projects/{プロジェクトID}/datasets/{データセットID}/routines/{ルーティンID}
が実行されます。
3.2.2. クエリパラメータ
リクエストパラメータはありません。
3.2.3. リクエストボディ
リクエストボディはありません。
3.3. レスポンスの内容
レスポンスはありません。
削除に失敗した場合は例外が発生します。
おしまい。。