🏃‍♂️

BigQuery Runner for VSCode の紹介

3 min read

https://marketplace.visualstudio.com/items?itemName=minodisk.bigquery-runner

モチベーション

BigQueryのWebエディタのように、VSCodeでクエリを書いて実行結果を見たい。

やること

責務範囲は、クエリの検証から実行結果の出力までとしている。

クエリの実行体験の向上

この拡張はgoogle/vscode-bigqueryのフォークだ。
フォーク元の実装は、荒削りだが欲しいものがミニマルに詰まった拡張という印象だった。
ただし、フォーク元の実装には大きく2つの問題があった。

1つ目は、実行結果のArray型やStruct型の表示をサポートしておらず、一部のフィールドの値が表示されなかった。
この問題の解決のために、深いObjectをフラットなObjectの配列に変形するminodisk/tenderizerというパッケージを開発した。その後、高速化のためテーブルのスキーマを使って同様の処理を行うよう、実装を変更[1]した。
このパッケージを組み込み、実行結果のArrayやStructを表現できるようにした。
その後、テーブルのスキーマを使って、同様のことをより効率よく行う実装に変更[1:1]した。

2つ目は、実行結果の表示時にOutputウィンドウにフォーカスが奪われていた。
このため実行後にクエリを編集するには、クエリファイルを開いているウィンドウにフォーカスを戻す必要があった。
この問題にはOutputウィンドウを表示する際に、フォーカスを奪わないように実装を変更した。

この2つの問題を解決することで、ストレスなくクエリを実行できるようになった。

クエリの修正体験の向上

BigQueryのWebエディタは、書いているクエリが間違っている場合にエラーを表示する。
エラーメッセージもある程度分かりやすいため、エラー内容に応じてクエリを修正できる。

BigQueryには、dryRunというクエリの実行方法がある。
dryRunでは課金は発生しない上に、クエリが正しくない場合はエラーを返す。
この拡張ではクエリファイルの変更時にdryRunして、返されたエラーメッセージからエラーが発生箇所をパースしてエディタにフィードバックしている。

これにより使い慣れたVSCodeで、WebUI同等のクエリの修正体験ができるようになった。

できること

この拡張でできることのイメージが掴みやすいよう、クエリ実行のフローを示す。
検証・実行・整形・出力の4ステップからなる。

graph LR
  subgraph format[整形]
    table
    markdown
    json
    csv
    table-tag
  end
  subgraph output[出力]
    output-window
    file
    webview
  end
  
  verify --クエリ変更--> verify
  verify(クエリの検証) --コマンド実行--> run(クエリの実行)
  run --> table(文字列で整形されたテーブル)
  run --> markdown(Markdownテーブル)
  run --> json(JSON)
  run --> csv(CSV)
  run --> table-tag(HTMLのtableタグ)
  table --> output-window(Outputウィンドウ)
  markdown --> output-window
  json --> output-window
  csv --> output-window
  table --> file(ファイル)
  markdown --> file
  json --> file
  csv --> file
  table-tag --> webview(Webviewパネル)
  • 2022-01-14: Webviewパネルを追記[1:2]

クエリの正当性を検証できる

シンタックスエラー・型エラー・存在しないフィールド名やサポートされていない処理などのエラーを検出する。
エラーメッセージ内にエラーの行と列を返してくれる場合は、エディタにエラーの発生箇所を表示する。

コマンドで実行できる

コマンドパレットからコマンドをコールしてクエリを実行できる。
コマンドをキーバインドに設定することで、素早く実行が可能になる。

結果をいくつかの方法で整形できる

整形されたテーブル

クエリを書いては試すサイクルを回しているケースを想定している。

Markdownのテーブル

次のような、Markdownなドキュメントに実行結果を貼るケースを想定している。

https://zenn.dev/minodisk/articles/0232d918ff8d82

JSON

実行結果をデータソースとして、プログラムに読み込ませるケースを想定している。

JSON Lines

行ごとにJSONにして、改行コードで行を区切るフォーマット。
実行結果を、BigQueryにバルクロードするケースを想定している。

https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-json

CSV

オプションで区切り文字を設定できるため、TSVなどにもフォーマットできる。
Google Spreadsheet などの表計算ソフトで開くケースを想定している。

整形したデータをいくつかの方法で出力できる

Webviewパネル[1:3]

クエリを書いては実行するサイクルを回すことを想定している。
縦横に巨大なテーブルを表示しても見やすい。

Outputウィンドウ

クエリを書いては実行するサイクルを回すことを想定している。
小さなテーブルを表示するのに向いている。
整形されたテーブルのフォーマットと相性が良い。

ファイル

実行結果をExportすることを想定している。
JSON、JSON LinesやCSVといったフォーマットと相性が良い。

まとめ

BigQueryのWebUIでクエリを実行していて、普段VSCodeを使っている方はこの拡張を試して欲しい。
コントリビュートも大歓迎🙋‍♀️

https://github.com/minodisk/bigquery-runner
脚注
  1. v0.0.21で追加した実装 ↩︎ ↩︎ ↩︎ ↩︎

Discussion

ログインするとコメントできます