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)の制限事項がすべて適用されます。

始める前に

  1. JDBC ドライバ、Apache Maven、java.sql パッケージについて理解しておいてください。
  2. システムが Java Runtime Environment(JRE)8.0 以降で構成されていることを確認します。JRE バージョンの確認については、JRE 環境の確認をご覧ください。
  3. BigQuery に対して認証し、次の情報をメモします。この情報は、後で BigQuery 用の JDBC ドライバとの接続を確立するときに使用します。使用する認証方法に対応する情報のみをメモする必要があります。

    認証方法 認証情報 接続プロパティ(後で設定)
    標準サービス アカウント サービス アカウントのメールアドレス bq-jdbc-sa@mytestproject.iam.gserviceaccount.com OAuthServiceAcctEmail
    サービス アカウント キー(JSON オブジェクト) my-sa-key OAuthPvtKey
    サービス アカウント キーファイル サービス アカウント キーファイル(フルパス) path/to/file/secret.json OAuthPvtKeyPath
    Google ユーザー アカウント クライアント ID 123-abc.apps.googleusercontent.com OAuthClientId
    クライアント シークレット _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uV OAuthClientSecret
    事前に生成されたアクセス トークン アクセス トークン ya29.a0AfH6SMCiH1L-x_yZ OAuthAccessToken
    事前生成された更新トークン 更新トークン 1/fFAGRNJru1FTz70BzhT3Zg OAuthRefreshToken
    クライアント ID 123-abc.apps.googleusercontent.com OAuthClientId
    クライアント シークレット _aB-C1D_E2fGh3Ij4kL5m6No7p8QR9sT0uV OAuthClientSecret
    アプリケーションのデフォルト認証情報 なし なし なし
    構成ファイル 構成ファイル(JSON オブジェクトまたはフルパス) path/to/file/secret.json OAuthPvtKey
    外部アカウント構成オブジェクト アカウント構成オブジェクト external_account_configuration_object OAuthPvtKey
    その他 外部アカウント構成ファイルのオーディエンス プロパティ //iam.googleapis.com/projects/my-project/locations/US-EAST1/workloadIdentityPools/my-pool-/providers/my-provider BYOID_AudienceUri
    トークン取得と環境情報ファイル {\"file\":\"/path/to/file\"} BYOID_CredentialSource
    ユーザー プロジェクト(Workforce プールを使用している場合のみ) my_project BYOID_PoolUserProject
    サービス アカウントの権限借用の URI(Workforce プールを使用している場合のみ) my-sa BYOID_SA_Impersonation_Uri
    トークン交換仕様に基づく Security Token Service トークン urn:ietf:params:oauth:tokentype:id_token BYOID_SubjectTokenType
    Security Token Service トークン交換エンドポイント https://sts.googleapis.com/v1/token BYOID_TokenUri

開発環境を構成します

BigQuery 用の JDBC ドライバを使用して開発環境を構成するには、次の操作を行います。

  1. 次のいずれかの JDBC パッケージをダウンロードします。

  2. ダウンロードした JAR ファイルをクラスパスに追加して、Java コンパイラとランタイムが必要な JDBC クラスを見つけられるようにします。ファイルをクラスパスに追加する方法については、クラスパスの設定をご覧ください。

  3. ビルドファイルに次の依存関係を追加します。

    <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>
  4. Gradle プロジェクトを使用している場合は、ビルドファイルに次のコードを追加します。

    dependencies {
    // ... other dependencies
    implementation files('path/to/file/google-jdbc-jar-with-dependencies.jar')
    }

接続を確立する

BigQuery 用 JDBC ドライバを使用して Java アプリケーションと BigQuery の間に接続を確立するには、次の操作を行います。

  1. 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 ドライバの追加の接続プロパティ。接続プロパティの一覧については、接続プロパティをご覧ください。
  2. 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:token-type:jwt
  • urn:ietf:params:oauth:token-type:id_token
  • urn:ietf:params:oauth:token-type:saml2
  • urn:ietf:params:aws:token-type:aws4_request
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 次のものをオーバーライドするカスタム エンドポイント:
  • BIGQUERY=https://bigquery.googleapis.com
  • READ_API=https://bigquerystorage-googleapis-com.mygreatmarket.com
  • OAUTH2=https://oauth2.googleapis.com
  • STS=https://sts.googleapis.com
なし カンマ区切りの文字列 ×
FilterTablesOnDefaultDataset DatabaseMetaData.getTables() メソッドと DatabaseMetaData.getColumns() メソッドによって返されるメタデータのスコープを決定します。FALSE に設定すると、フィルタリングは行われません。フィルタリングを有効にするには、DefaultDataset プロパティも設定する必要があります。 FALSE ブール値 ×
HighThroughputActivationRatio クエリ レスポンスのページ数のしきい値。この数を超え、EnableHighThroughputAPIHighThroughputMinTableSize の条件が満たされると、ドライバは Storage Read API の使用を開始します。 2 Integer ×
HighThroughputMinTableSize クエリ レスポンスの行数のしきい値。この数を超え、EnableHighThroughputAPIHighThroughputActivationRatio の条件が満たされると、ドライバは 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: OFF レベル
  • 1: SEVERE レベル
  • 2: WARNING レベル
  • 3: INFO レベル
  • 4: CONFIG レベル
  • 5: FINE レベル
  • 6: FINER レベル
  • 7: FINEST レベル
  • 8: ALL レベル
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=0OAuthPvtKeyPath の値が設定されていない場合のみ
OAuthPvtKeyPath サービス アカウント認証を使用する場合のサービス アカウント キーのパス。 なし 文字列 OAUTH_TYPE=0OAuthPvtKeyOAuthServiceAcctEmail の値が設定されていない場合のみ
OAuthRefreshToken 事前生成された更新トークン認証用の更新トークン。 なし 文字列 OAUTH_TYPE=2 の場合のみ
OAuthServiceAcctEmail サービス アカウント認証を使用する場合のサービス アカウントのメールアドレス。 なし 文字列 OAUTH_TYPE=0OAuthPvtKeyPath の値が設定されていない場合のみ
OAuthType 認証タイプ。次のいずれかです。
  • 0: サービス アカウント認証
  • 1: ユーザー アカウントの認証
  • 2: 事前生成された更新トークンまたはアクセス トークンの認証
  • 3: アプリケーションのデフォルト認証情報による認証
  • 4: その他の認証方法
-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 の標準料金が適用されます。

次のステップ