ElixirでBigQueryを操作するツールを作った


ElixirでBigQueryのスキーマの管理も含めて色々したかったのですが、欲しいと思ったときに良さげなツールを見つけることができなかったので自分で作りました。
なのでこちらでちょっと紹介させて下さい。

つくったもの

使いかた

準備

  • 最初に以下の設定が必要です
# mix.exs
def deps do
  [
    {:blanton, "~> 0.1.3"}
  ]
end
# config/config.exs
config :goth,
  json: "path/to/google/json/creds.json" |> File.read!

config :blanton,
  project_id: "PROJECT_ID",
  dataset_id: "DATASET_ID"

テーブルを作成する

  • 最初にlib/に適当なディレクトリを作成しておく
  • 以下のようなファイルを作成する
# lib/APP_NAME/bq_schema/TABLE_NAME.ex

defmodule APP_NAME.BqSchema.TABLE_NAME do
  # ↓をuseする
  use Blanton.Schema

  # schemaマクロの中にテーブルの定義を書いていく
  schema :TABLE_NAME do
    field :column_name, :string, :required
    field :some_field_column, :record, :repeated, [
      sub_field(:name, :string, :nullable),
      sub_field(:price, :int64, :nullable),
    ]
  end

  # Table作成時に指定するオプションはこっちに指定する
  # options do
  #   partitiondate
  #   register :timePartitioning, %GoogleApi.BigQuery.V2.Model.TimePartitioning{type: "DAY"}
  # end
end
  • ファイル作成後に mix bq.migrate PATH/TO/SCEHMA_DIRを実行するとBigQuery上にテーブルが作成されます。
    • mix bq.migrate.dropを実行すると容赦なくテーブルが削除されます

レコードを挿入する

  • 事前に挿入するデータをMapの配列で用意します。
  • Blanton.Record.insert("TABLE_NAME", records)で挿入できます

records = [
  %{name: "安室透", age: 29},
  %{name: "赤井秀一", age: 32},
]

table_name = "users"
Blanton.Record.insert("PROJECT_ID", "DATASET_ID", table_name, records)
Blanton.Record.insert(table_name, records)

レコードの検索機能が無い

  • このツールが必要になったときSELECT文を発行する予定が無かったので現時点(2020/8/6)ではSELECTはできません
    • ただし近々対応する予定です。

おまけ #1

誰でも使えるパッケージを書いたのが実は初めてなのでわからんところを調べながら実装しました。
Elixirらしくないところも多分に含んでいると思いますがhex.pmに公開するところまでなんとか持っていくことができました。
すでに自分では他のリポジトリでも利用していますが、私以外にも何人かの方がどうやらダウンロードしてくれているようなので大変うれしく思います。
バグとかまずい所見つけたとか機能追加したとかありましたらPRいただけると幸いです。

おまけ #2

Elixirでライブラリを探すとき、Rubyなどの言語だとググると思うんですがElixirだと出てこないときがあります。
そういう時はhex.pmで検索してみるのがおすすめです!