🙌

RubyでBigQuery Emulatorを使う

2023/09/25に公開2

そもそもBigQuery Emulatorについて

BigQuery EmulatorはGoogleBigQueryのモックサービスのようなもので、
これまで、BigQueryを利用した分析クエリの実装など、ユニットテストの実装がコストが高く、
面倒なところだったので、ユニットテストは作らずレビューのみでカバーしていたりしたのですが、これは便利そうです。今のところ他にも決定版はなさそうで、現状これ一択かなと。

https://github.com/goccy/bigquery-emulator

ですが、Rubyのクライアントで使ってみるまでに少し対応が必要だったので、動かすまでの方法を残しておく。

ここでは、BigQueryEmulatorの基本的な使い方だったりは他の記事でもそれなりに情報があるので、
それをどうやってRubyのクライアントで使うか?の説明にとどめます。

1. queryが動かないので、ForkされたBigQuery Emulatorを利用する

2023/09/18 現在、issueにもあるのですが、情報が足りないため、RubyのClientではqueryメソッドを実行すると、情報は取得できているものの、クライアントがレスポンスを組み立てる際に、エラーになるようです。

https://github.com/goccy/bigquery-emulator/pull/187

現状、このコードはMergeされていないので、Forkされた実装を利用するしかないです。
Docker Composeで動かしたかったので、Forkされたコードをビルドしてレジストリにプッシュして対応しました。

2. クライアントの設定を行う

クライアントには gem 'google-cloud-bigquery'を利用しています。

クライアントの設定を下記で行ってください。
特筆するべき点は、config.endpointで0.0.0.0:9050を設定していて、
Docker Composeで立ち上げているBigQuery Emulatorを参照するようにしています。
ちゃんと/まで入力しないとエラーになるので気をつけてください。

def initialize
  Google::Cloud::Bigquery.configure do |config|
    config.project_id  = "dummy_project_name"
    config.credentials = Rails.root.join("config/service_account.json")
    config.endpoint = "http://0.0.0.0:9050/"
  end
  @bigquery = Google::Cloud::Bigquery.new
end

以上の設定を行うと、BigQuery Emulatorを接続先としてGoogle::Cloud::Bigqueryからおこなうようにできるようになりました。

まとめ

このエミュレーターがどこまで利用できるかは現在も検証中ですが、最新鋭の機能を使ったりしなければ問題なく使えそうな感じがしました。
エミュレーターを使ってRSpecやMiniTest上でBigQueryのクエリを利用した実装のユニットテストを書いたりできるので、RubyとBigQueryを組み合わせたプロダクトの開発や作りたいツールがあるので活用できればと考えています。

OSIRO テックブログ

Discussion

Hiroyuki KuromiyaHiroyuki Kuromiya

まとめていただきありがとうございます
google-cloud-ruby は9月4日リリースの最新版から環境変数 BIGQUERY_EMULATOR_HOST がサポートされるようになりました
destination table の件は私も色々コードを見たりしていて、修正すると動くようになるのは確かなんですが、なぜそのような修正が必要なのかをいまいち理解できてなくて、それがマージの障害になっている感じです

webuilder240webuilder240

良きツール作ってくださり、ほんとありがたいです!!
補足についてもありがたいです。後ほど追記させていただきます!

destination table の件は私も色々コードを見たりしていて、修正すると動くようになるのは確かなんですが、なぜそのような修正が必要なのかをいまいち理解できてなくて、それがマージの障害になっている感じです

コードのMergeについてもそうですよね。。
私も少しコードを読んだりしましたが、Rubyのクライアントだけで、関連性はすぐにはわからないですよね。。