IntelliJ系(DataGrip含む)でBigQueryに接続する方法

# 注意

注: この記事の内容は古いです。IntelliJのバージョンが2021.1以上の人は以下の方法で接続したほうが良いです。

https://dev.classmethod.jp/articles/intellij-datagrid_bigquery/


--------

IntelliJ便利ですよね。
JavaのIDEとして有名ですが、その他にも様々な言語のIDEとしても使えますし、さらにはDBクライアントとしても優秀です。
対応しているDBの種類が豊富ですし、機能もリッチです。
ですが、BigQueryにはデフォルトで対応していないので、そこだけちょっと惜しいです。

この記事ではIntelliJ系のIDEからBigQueryに接続する方法を説明します。

# 参考にした手法とその問題点
`IntelliJ BigQuery` でGoogle検索すると以下の記事が最初に見つかります。
https://blog.jetbrains.com/datagrip/2018/07/10/using-bigquery-from-intellij-based-ide/

この記事のとおりにやれば、BigQueryに接続することができそうです。
しかし、、、

<img width="839" alt="貼り付けた画像_2020_05_16_17_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/6f607127-935b-f935-e4bd-d4607a81c78a.png">

**ほげえええええええ！！** サービスアカウント！！！サービスアカウントォォ！！！

そうです。サービスアカウントを使っているんです。
本来、サービスアカウントはサーバー等からGCPのサービスを使う時に用いるものですので、これを個人ユーザーが使うのは問題があります。
例えば、この方法で発行したサービスアカウントをチーム皆で使い回すと、DBアクセスをした個人が不明になってしまい、監査的にマズイことに繋がります。
それならばと、個人ごとに個別のサービスアカウントを発行しようとすると今度は管理する必要のあるアカウントの数が倍になってしまい、アカウントの管理コストも倍になります。

ですので、サービスアカウントではなく、ユーザーアカウントでBigQueryに接続しましょう！！！

# 手順
## application_default_credentials.jsonの生成
最初に以下のコマンドを実行して、ユーザーアカウントで認証をするためのJSONファイルを生成します。

```bash
$ gcloud auth application-default login
```

コマンドを実行すると、ブラウザによってGoogleのログインフォームが開かれるので、ログインを行います。
認証が成功すると、`~/.config/gcloud/application_default_credentials.json`というファイルが生成されます。
ぶっちゃけると、後の手順は上に貼ったJetBrainsのBlog記事と変わらないですが、一応書いておきます。

なお、`gcloud auth login`をやったことはあるけど、今回のコマンドとの違いが分からないという方は、以下の神ドキュメントを一読することをオススメします。
(ユーザーアカウント, サービスアカウント)×(Cloud SDK, サーバーアプリケーション)という合計4パターンがあることが分かれば体系的に理解しやすいです。

[GCP と OAuth2](https://medium.com/google-cloud-jp/gcp-%E3%81%A8-oauth2-91476f2b3d7f)

## BigQuery用のJDBCドライバーの取得
以下のページから、JDBCドライバーをダウンロードします。
ODBCドライバーという似た名前のものが上の方で幅をきかせているので、間違ってダウンロードしないように注意しましょう。

[BigQuery の Magnitude Simba ドライバ
](https://cloud.google.com/bigquery/providers/simba-drivers)

ダウンロードしたら、zipファイルを解凍して、適当なディレクトリに配置しておきます。


## IntelliJにBigQuery Driverを登録

<img width="338" alt="スクリーンショット 2020-05-16 17.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/c4bb32ff-d0f0-8f34-6b37-ce60607b1a03.png">
Driverを選択して、Driver追加画面を開く。


<img width="1322" alt="スクリーンショット 2020-05-16 17.46.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/24137909-91e0-492e-fcb5-788a38930082.png">

NameをBigQueryにする。
Driver filesにさっきダウンロードしたzipの中にあるjarファイルを全部登録。
Classに `com.simba.googlebigquery.jdbc42.Driver` を指定。
※ jarファイル登録直後はドロップダウンメニューに表れないので、ちょっと待つ
URL templatesのdefaultに `jdbc:bigquery://[{host::https\://www.googleapis.com/bigquery/v2}[:{port::443}]][<;,{:identifier}={:param}>]` を指定。

<img width="1324" alt="スクリーンショット 2020-05-16 17.50.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/2b13f952-21cb-62fa-6635-b35a3cc316b3.png">
AdvancedタブのOAuthTypeを0に設定。

で、OKを押して、BigQuery Driverを登録。

## IntelliJにBigQuery Data Sourceを登録
<img width="476" alt="スクリーンショット 2020-05-16 17.52.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/130b436c-39cf-8455-250f-19d7780374e7.png">

Data Source → BigQueryを選択して、Data Source追加画面を開く。

<img width="1056" alt="スクリーンショット 2020-05-16 17.56.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/3d680452-ad84-00d8-4b68-31358f36f76e.png">

NameをBigQueryに指定。

<img width="1088" alt="貼り付けた画像_2020_05_16_17_57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/552f7d04-086e-07d4-5441-ff1fc50cef34.png">
Advancesタブで以下を指定。
OAuthPvKeyPath: `application_default_credentials.json` の絶対パス
OAuthServiceAccEmail: `application_default_credentials.json`を生成する時にログインで使ったメールアドレス
ProjectId: いつも使っているGCPプロジェクトのID

<img width="1055" alt="スクリーンショット 2020-05-16 18.00.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/6544d321-6d07-b9e7-5260-d0263fccdd75.png">

Generalタブに戻り、Test Connectionで接続確認をしてからOKを押してData Sourceを登録する。

## クエリを投げる
<img width="987" alt="貼り付けた画像_2020_05_16_18_03-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/339583ba-36c4-33bd-85a6-e70497b64f5e.png">


Data Source一覧の中にBigQueryがいるので、それを選択し、クエリを書いて実行する。
テーブル名を指定するときには以下の書式で指定する。

```
`プロジェクトID.データセット名.テーブル名`
```

Data Source作成の時に指定したProjectId内のテーブルを参照するときには、以下のプロジェクトIDを省略した形式も可。

```
`データセット名.テーブル名`
```