BigQuery 用の JDBC ドライバを使用する
BigQuery 用の Java Database Connectivity(JDBC)ドライバは、Java アプリケーションを BigQuery に接続し、任意のツールとインフラストラクチャで BigQuery の機能を使用できるようにします。Java 以外のアプリケーションを BigQuery に接続するには、BigQuery 用の Simba Open Database Connectivity(ODBC)ドライバを使用します。
制限事項
BigQuery 用の JDBC ドライバには次の制限があります。
- このドライバは BigQuery 専用であり、他のプロダクトやサービスでは使用できません。
- BigQuery Storage Read API では、
INTERVALデータ型はサポートされていません。 - データ操作言語(DML)の制限事項がすべて適用されます。
始める前に
- JDBC ドライバ、Apache Maven、
java.sqlパッケージについて理解しておいてください。 - システムが Java Runtime Environment(JRE)8.0 以降で構成されていることを確認します。JRE バージョンの確認については、JRE 環境の確認をご覧ください。
BigQuery に対して認証し、次の情報をメモします。この情報は、後で BigQuery 用の JDBC ドライバとの接続を確立するときに使用します。使用する認証方法に対応する情報のみをメモする必要があります。
認証方法 認証情報 例 接続プロパティ(後で設定) 標準サービス アカウント サービス アカウントのメールアドレス bq-jdbc-sa@mytestproject.iam.gserviceaccount.comOAuthServiceAcctEmailサービス アカウント キー(JSON オブジェクト) my-sa-keyOAuthPvtKeyサービス アカウント キーファイル サービス アカウント キーファイル(フルパス) path/to/file/secret.jsonOAuthPvtKeyPathGoogle ユーザー アカウント クライアント ID 123-abc.apps.googleusercontent.comOAuthClientIdクライアント シークレット _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uVOAuthClientSecret事前に生成されたアクセス トークン アクセス トークン ya29.a0AfH6SMCiH1L-x_yZOAuthAccessToken事前生成された更新トークン 更新トークン 1/fFAGRNJru1FTz70BzhT3ZgOAuthRefreshTokenクライアント ID 123-abc.apps.googleusercontent.comOAuthClientIdクライアント シークレット _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uVOAuthClientSecretアプリケーションのデフォルト認証情報 なし なし なし 構成ファイル 構成ファイル(JSON オブジェクトまたはフルパス) path/to/file/secret.jsonOAuthPvtKey外部アカウント構成オブジェクト アカウント構成オブジェクト external_account_configuration_objectOAuthPvtKeyその他 外部アカウント構成ファイルのオーディエンス プロパティ //iam.googleapis.com/projects/my-project/locations/US-EAST1/workloadIdentityPools/my-pool-/providers/my-providerBYOID_AudienceUriトークン取得と環境情報ファイル {\"file\":\"/path/to/file\"}BYOID_CredentialSourceユーザー プロジェクト(Workforce プールを使用している場合のみ) my_projectBYOID_PoolUserProjectサービス アカウントの権限借用の URI(Workforce プールを使用している場合のみ) my-saBYOID_SA_Impersonation_Uriトークン交換仕様に基づく Security Token Service トークン urn:ietf:params:oauth:tokentype:id_tokenBYOID_SubjectTokenTypeSecurity Token Service トークン交換エンドポイント https://sts.googleapis.com/v1/tokenBYOID_TokenUri
開発環境を構成します
BigQuery 用の JDBC ドライバを使用して開発環境を構成するには、次の操作を行います。
次のいずれかの JDBC パッケージをダウンロードします。
- Uber JAR。すべての依存関係を含む JAR ファイル。
- シェーディングされた Uber JAR。すべての依存関係を含むシェーディングされた JAR ファイル。
- 依存関係を含む thin JAR。thin JAR ファイルとすべての依存関係を含む zip ファイル。
ダウンロードした JAR ファイルをクラスパスに追加して、Java コンパイラとランタイムが必要な JDBC クラスを見つけられるようにします。ファイルをクラスパスに追加する方法については、クラスパスの設定をご覧ください。
ビルドファイルに次の依存関係を追加します。
<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bigquery-jdbc</artifactId> <version>0.0.1</version> <scope>system</scope> <systemPath>path/to/file/google-jdbc-jar-with-dependencies.jar</systemPath> </dependency>
Gradle プロジェクトを使用している場合は、ビルドファイルに次のコードを追加します。
dependencies { // ... other dependencies implementation files('path/to/file/google-jdbc-jar-with-dependencies.jar') }
接続を確立する
BigQuery 用 JDBC ドライバを使用して Java アプリケーションと BigQuery の間に接続を確立するには、次の操作を行います。
BigQuery 用の JDBC ドライバの接続文字列を特定します。この文字列には、Java アプリケーションと BigQuery 間の接続を確立するために必要なすべての情報が含まれています。接続文字列の形式は次のとおりです。
jdbc:bigquery://HOST:PORT;ProjectId=PROJECT_ID;OAuthType=AUTH_TYPE;AUTH_PROPS;OTHER_PROPS
次のように置き換えます。
HOST: サーバーの DNS または IP アドレス。PORT: TCP ポート番号。PROJECT_ID: BigQuery プロジェクトの ID。AUTH_TYPE: 使用した認証のタイプを指定する数値。次のいずれかです。0: サービス アカウント認証(標準とキーファイル)の場合1: Google ユーザー アカウントの認証2: 事前生成された更新トークンまたはアクセス トークンの認証の場合3: アプリケーションのデフォルト認証情報による認証の場合4: その他の認証方法の場合
AUTH_PROPS: BigQuery への認証時にメモした認証情報。property_1=value_1; property_2=value_2;...形式で指定します。たとえば、サービス アカウント キーファイルで認証した場合はOAuthPvtKeyPath=path/to/file/secret.jsonです。OTHER_PROPS(省略可):property_1=value_1; property_2=value_2;...形式で指定された JDBC ドライバの追加の接続プロパティ。接続プロパティの一覧については、接続プロパティをご覧ください。
DriverManagerクラスまたはDataSourceクラスを使用して、Java アプリケーションを BigQuery 用 JDBC ドライバに接続します。DriverManagerクラスに接続します。import java.sql.Connection; import java.sql.DriverManager; private static Connection getJdbcConnectionDM(){ Connection connection = DriverManager.getConnection(CONNECTION_STRING); return connection; }
CONNECTION_STRINGは、前のステップで取得した接続文字列に置き換えます。DataSourceクラスに接続します。import com.google.cloud.bigquery.jdbc.DataSource; import java.sql.Connection; import java.sql.SQLException; private static public Connection getJdbcConnectionDS() throws SQLException { Connection connection = null; DataSource dataSource = new com.google.cloud.bigquery.jdbc.DataSource(); dataSource.setURL(CONNECTION_STRING); connection = dataSource.getConnection(); return connection; }
CONNECTION_STRINGは、前のステップで取得した接続文字列に置き換えます。DataSourceクラスには、接続文字列に含めるのではなく、接続プロパティを設定するために使用できるセッター メソッドもあります。次に例を示します。private static Connection getConnection() throws SQLException { DataSource ds = new DataSource(); ds.setURL(jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;); ds.setAuthType(3); // Application Default Credentials ds.setProjectId("MyTestProject"); ds.setEnableHighThroughputAPI(true); ds.setLogLevel("6"); ds.setUseQueryCache(false); return ds.getConnection(); }
接続プロパティ
JDBC ドライバ接続プロパティは、データベースへの接続を確立するときに接続文字列に含めるか、セッター メソッドを介して渡す構成パラメータです。BigQuery 用 JDBC ドライバでは、次の接続プロパティがサポートされています。
| 接続プロパティ | 説明 | デフォルト値 | データの種類 | 必須 |
|---|---|---|---|---|
AdditionalProjects |
ProjectId プロパティで設定されたプライマリ プロジェクトに加えて、ドライバがクエリとメタデータ オペレーションでアクセスできるプロジェクト。 |
なし | カンマ区切りの文字列 | × |
AllowLargeResults |
QueryDialect プロパティが BIG_QUERY に設定されている場合に、ドライバが 128 MB を超えるクエリ結果を処理するかどうかを決定します。QueryDialect プロパティが SQL に設定されている場合、ドライバは常に大規模なクエリ結果を処理します。 |
TRUE |
ブール値 | × |
BYOID_AudienceUri |
外部アカウント構成ファイルのオーディエンス プロパティ。オーディエンス プロパティには、Workload Identity プールまたは Workforce プールのリソース名と、そのプール内のプロバイダ ID を含めることができます。 | なし | 文字列 | OAuthType=4 の場合のみ |
BYOID_CredentialSource |
トークンの取得と環境情報。 | なし | 文字列 | OAuthType=4 の場合のみ |
BYOID_PoolUserProject |
Workforce プールが認証に使用されている場合のユーザー プロジェクト。 | なし | 文字列 | OAuthType=4 を使用し、workforce プールを使用している場合のみ |
BYOID_SA_Impersonation_Uri |
ワークフォース プールが認証に使用されている場合のサービス アカウントの権限借用の URI。 | なし | 文字列 | OAuthType=4 を使用し、workforce プールを使用している場合のみ |
BYOID_SubjectTokenType |
トークン交換仕様に基づく Security Token Service トークン。次のいずれかです。
|
urn:ietf:params:oauth:tokentype:id_token |
文字列 | OAuthType=4 の場合のみ |
BYOID_TokenUri |
Security Token Service トークン交換エンドポイント。 | https://sts.googleapis.com/v1/token |
文字列 | × |
ConnectionPoolSize |
接続プールが有効になっている場合の接続プールサイズ。 | 10 |
長い | × |
DefaultDataset |
クエリで指定されていない場合に使用されるデータセット。 | なし | 文字列 | × |
EnableHighThroughputAPI |
Storage Read API を使用できるかどうかを判断します。Storage Read API を使用するには、HighThroughputActivationRatio プロパティと HighThroughputMinTableSize プロパティも TRUE に設定する必要があります。 |
FALSE |
ブール値 | × |
EnableSession |
接続がセッションを開始するかどうかを決定します。TRUE に設定すると、セッション ID は後続のすべてのクエリに渡されます。 |
FALSE |
ブール値 | × |
EnableWriteAPI |
Storage Write API を使用できるかどうかを判断します。一括挿入を有効にするには、TRUE に設定する必要があります。 |
FALSE |
ブール値 | × |
EndpointOverrides |
次のものをオーバーライドするカスタム エンドポイント:
|
なし | カンマ区切りの文字列 | × |
FilterTablesOnDefaultDataset |
DatabaseMetaData.getTables() メソッドと DatabaseMetaData.getColumns() メソッドによって返されるメタデータのスコープを決定します。FALSE に設定すると、フィルタリングは行われません。フィルタリングを有効にするには、DefaultDataset プロパティも設定する必要があります。 |
FALSE |
ブール値 | × |
HighThroughputActivationRatio |
クエリ レスポンスのページ数のしきい値。この数を超え、EnableHighThroughputAPI と HighThroughputMinTableSize の条件が満たされると、ドライバは Storage Read API の使用を開始します。 |
2 |
Integer | × |
HighThroughputMinTableSize |
クエリ レスポンスの行数のしきい値。この数を超え、EnableHighThroughputAPI と HighThroughputActivationRatio の条件が満たされると、ドライバは Storage Read API の使用を開始します。 |
100 |
Integer | × |
JobCreationMode |
クエリをジョブありで実行するか、ジョブなしで実行するかを決定します。1 値は、クエリごとにジョブが作成されることを意味します。2 値は、ジョブなしでクエリを実行できることを意味します。 |
2 |
Integer | × |
JobTimeout |
ジョブがサーバーでキャンセルされるまでのジョブ タイムアウト(秒単位)。 | 0 |
長い | × |
KMSKeyName |
データを暗号化するための KMS 鍵の名前。 | なし | 文字列 | × |
Labels |
クエリに関連付けられたラベル。クエリジョブの整理とグループ化に使用されます。 | なし | Map<String, String> | × |
LargeResultDataset |
大規模なクエリ結果の宛先データセット。LargeResultTable プロパティが設定されている場合にのみ適用されます。このプロパティを設定すると、結果が小さい場合でも、データ書き込みは結果キャッシュをバイパスし、クエリごとに課金がトリガーされます。 |
_google_jdbc |
文字列 | × |
LargeResultsDatasetExpirationTime |
大きな結果データセット内のすべてのテーブルの存続期間(ミリ秒)。データセットにすでにデフォルトの有効期限が設定されている場合、このプロパティは無視されます。 | 3600000 |
長い | × |
LargeResultTable |
大規模なクエリ結果の宛先テーブル。LargeResultDataset プロパティが設定されている場合にのみ使用されます。このプロパティを設定すると、データ書き込みは結果キャッシュをバイパスし、結果が小さくてもクエリごとに課金がトリガーされます。 |
temp_table... |
文字列 | × |
ListenerPoolSize |
接続プーリングが有効になっている場合、リスナー プールサイズ。 | 10 |
長い | × |
Location |
データセットが作成またはクエリされるロケーション。このプロパティが設定されていない場合、BigQuery はロケーションを自動的に決定します。 | なし | 文字列 | × |
LogLevel |
データベースのやり取り中に java.util.logging パッケージによって記録される詳細レベル。ロギングはパフォーマンスに影響する可能性があるため、問題をキャプチャするために一時的にのみ有効にします。次のいずれかです。
|
0 |
Integer | × |
LogPath |
ログファイルが書き込まれるディレクトリ。 | なし | 文字列 | × |
MaximumBytesBilled |
課金されるバイト数の上限。この数を超える課金対象のバイト数を含むクエリは失敗し、料金は発生しません。 | 0 |
長い | × |
MaxResults |
ページあたりの結果の最大数。 | 10000 |
長い | × |
MetaDataFetchThreadCount |
データベース メタデータ メソッドに使用されるスレッドの数。 | 32 |
Integer | × |
OAuthAccessToken |
事前生成されたアクセス トークンの認証に使用されるアクセス トークン。 | なし | 文字列 | OAUTH_TYPE=2 の場合のみ |
OAuthClientId |
事前生成された更新トークン認証とユーザー アカウント認証のクライアント ID。 | なし | 文字列 | OAUTH_TYPE=1 または OAUTH_TYPE=2 の場合のみ |
OAuthClientSecret |
事前生成された更新トークン認証とユーザー アカウント認証用のクライアント シークレット。 | なし | 文字列 | OAUTH_TYPE=1 または OAUTH_TYPE=2 の場合のみ |
OAuthP12Password |
PKCS12 鍵ファイルのパスワード。 | notasecret |
文字列 | × |
OAuthPvtKey |
サービス アカウント認証を使用する場合のサービス アカウント キー。この値は、未加工の JSON キーファイル オブジェクトまたは JSON キーファイルへのパスにできます。 | なし | 文字列 |
OAUTH_TYPE=0 と OAuthPvtKeyPath の値が設定されていない場合のみ |
OAuthPvtKeyPath |
サービス アカウント認証を使用する場合のサービス アカウント キーのパス。 | なし | 文字列 |
OAUTH_TYPE=0、OAuthPvtKey、OAuthServiceAcctEmail の値が設定されていない場合のみ |
OAuthRefreshToken |
事前生成された更新トークン認証用の更新トークン。 | なし | 文字列 |
OAUTH_TYPE=2 の場合のみ
|
OAuthServiceAcctEmail |
サービス アカウント認証を使用する場合のサービス アカウントのメールアドレス。 | なし | 文字列 |
OAUTH_TYPE=0 と OAuthPvtKeyPath の値が設定されていない場合のみ |
OAuthType |
認証タイプ。次のいずれかです。
|
-1 |
Integer | ○ |
PartnerToken |
Google Cloud パートナーがドライバの使用状況を追跡するために使用するトークン。 | なし | 文字列 | × |
ProjectId |
ドライバのデフォルト プロジェクト ID。このプロジェクトはクエリの実行に使用され、リソース使用量に対して課金されます。設定されていない場合、ドライバはプロジェクト ID を推測します。 | なし | 文字列 | ×(ただし強く推奨) |
ProxyHost |
JDBC 接続がルーティングされるプロキシ サーバーのホスト名または IP アドレス。 | なし | 文字列 | × |
ProxyPort |
プロキシ サーバーが接続をリッスンしているポート番号。 | なし | 文字列 | × |
ProxyPwd |
プロキシ サーバー経由で接続する際に認証が必要な場合に、認証に使用するパスワード。 | なし | 文字列 | × |
ProxyUid |
プロキシ サーバー経由で接続する際に認証が必要な場合に、認証に使用するユーザー名。 | なし | 文字列 | × |
QueryDialect |
クエリ実行用の SQL 言語。GoogleSQL には SQL(強く推奨)、レガシー SQL には BIG_QUERY を使用します。 |
SQL |
文字列 | × |
QueryProperties |
クエリの動作をカスタマイズする REST 接続プロパティ。 | なし | Map<String, String> | × |
RequestGoogleDriveScope |
1 に設定されている場合、接続に読み取り専用のドライブ スコープを追加します。 |
0 |
Integer | × |
RetryInitialDelay |
最初の再試行までの遅延時間(秒単位)を設定します。 | 0 |
長い | × |
RetryMaxDelay |
再試行遅延の最大制限(秒単位)を設定します。 | 0 |
長い | × |
ServiceAccountImpersonationChain |
権限借用チェーン内のサービス アカウントのメールアドレスのカンマ区切りリスト。 | なし | 文字列 | × |
ServiceAccountImpersonationEmail |
なり代わるサービス アカウントのメールアドレス。 | なし | 文字列 | × |
ServiceAccountImpersonationScopes |
権限を借用するアカウントで使用する OAuth2 スコープのカンマ区切りのリスト。 | https://www.googleapis.com/auth/bigquery |
文字列 | × |
ServiceAccountImpersonationTokenLifetime |
権限借用されたアカウント トークンの有効期間(秒単位)。 | 3600 |
Integer | × |
SSLTrustStore |
信頼できる認証局(CA)証明書を含む Java TrustStore のフルパス。ドライバは、このトラストストアを使用して、SSL/TLS handshake 中にサーバーの ID を検証します。 | なし | 文字列 | × |
SSLTrustStorePwd |
SSLTrustStore プロパティで指定された Java TrustStore のパスワード。 |
なし | 文字列 | Java TrustStore がパスワードで保護されている場合のみ |
SWA_ActivationRowCount |
executeBatch insert 行のしきい値。このしきい値を超えると、コネクタは Storage Write API に切り替わります。 |
3 |
Integer | × |
SWA_AppendRowCount |
書き込みストリームのサイズ。 | 1000 |
Integer | × |
Timeout |
コネクタが失敗した API 呼び出しを再試行してからタイムアウトするまでの時間(秒)。 | 0 |
長い | × |
UniverseDomain |
組織の Google Cloud リソースに関連付けられているトップレベル ドメイン。 | googleapis.com |
文字列 | × |
UnsupportedHTAPIFallback |
コネクタが REST API にフォールバックするか(TRUE に設定されている場合)、エラーを返すか(FALSE に設定されている場合)を決定します。 |
TRUE |
ブール値 | × |
UseQueryCache |
クエリ キャッシュ保存を有効にします。 | TRUE |
ブール値 | × |
ドライバでクエリを実行する
JDBC ドライバを介して BigQuery に接続された Java アプリケーションを使用して、標準の JDBC プロセスを介して開発環境でクエリを実行できるようになりました。すべての BigQuery の割り当てと上限が適用されます。
データ型マッピング
BigQuery 用の JDBC ドライバを介してクエリを実行すると、次のデータ型のマッピングが行われます。
| GoogleSQL 型 | Java 型 |
|---|---|
ARRAY |
Array |
BIGNUMERIC |
BigDecimal |
BOOL |
Boolean |
BYTES |
byte[] |
DATE |
Date |
DATETIME |
String |
FLOAT64 |
Double |
GEOGRAPHY |
String |
INT64 |
Long |
INTERVAL |
String |
JSON |
String |
NUMERIC |
BigDecimal |
STRING |
String |
STRUCT |
Struct |
TIME |
Time |
TIMESTAMP |
Timestamp |
例
以降のセクションでは、BigQuery 用 JDBC ドライバを使用して BigQuery の機能を使用する例を示します。
位置パラメータ
次の例では、位置パラメータを使用してクエリを実行します。
PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM MyTestTable where testColumn = ?"); preparedStatement.setString(1, "string2"); ResultSet resultSet = statement.executeQuery(selectQuery);
ネストされたレコードと繰り返しレコード
次の例では、Struct データのベースレコードをクエリします。
ResultSet resultSet = statement.executeQuery("SELECT STRUCT(\"Adam\" as name, 5 as age)"); resultSet.next(); Struct obj = (Struct) resultSet.getObject(1); System.out.println(obj.toString());
ドライバは、ベースレコードを構造体オブジェクトまたは JSON オブジェクトの文字列表現として返します。次のような結果になります。
{
"v": {
"f": [
{
"v": "Adam"
},
{
"v": "5"
}
]
}
}次の例では、Struct オブジェクトのサブコンポーネントをクエリします。
ResultSet resultSet = statement.executeQuery("SELECT STRUCT(\"Adam\" as name, 5 as age)"); resultSet.next(); Struct structObject = (Struct) resultSet.getObject(1); Object[] structComponents = structObject.getAttributes(); for (Object component : structComponents){ System.out.println(component.toString()); }
次の例では、繰り返しデータの標準配列をクエリし、結果を確認します。
// Execute Query ResultSet resultSet = statement.executeQuery("SELECT [1,2,3]"); resultSet.next(); Object[] arrayObject = (Object[]) resultSet.getArray(1).getArray(); // Verify Result int count =0; for (; count < arrayObject.length; count++) { System.out.println(arrayObject[count]); }
次の例では、繰り返しデータの Struct 配列をクエリし、結果を確認します。
// Execute Query ResultSet resultSet = statement.executeQuery("SELECT " + "[STRUCT(\"Adam\" as name, 12 as age), " + "STRUCT(\"Lily\" as name, 17 as age)]"); Struct[] arrayObject = (Struct[]) resultSet.getArray(1).getArray(); // Verify Result for (int count =0; count < arrayObject.length; count++) { System.out.println(arrayObject[count]); }
一括挿入
次の例では、executeBatch メソッドを使用して一括挿入オペレーションを実行します。
Connection conn = DriverManager.getConnection(connectionUrl); PreparedStatement statement = null; Statement st = conn.createStatement(); final String insertQuery = String.format( "INSERT INTO `%s.%s.%s` " + " (StringField, IntegerField, BooleanField) VALUES(?, ?, ?);", DEFAULT_CATALOG, DATASET, TABLE_NAME); statement = conn.prepareStatement(insertQuery1); for (int i=0; i<2000; ++i) { statement.setString(1, i+"StringField"); statement.setInt(2, i); statement.setBoolean(3, true); statement.addBatch(); } statement.executeBatch();
料金
BigQuery 用の JDBC ドライバは無料でダウンロードできます。また、ドライバを使用するために追加のライセンスは必要ありません。ただし、ドライバを使用する場合は、BigQuery の標準料金が適用されます。
次のステップ
- Google BigQuery 用の Simba ODBC ドライバの詳細を確認する。
- 他の BigQuery デベロッパー ツールを確認する。