3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-06

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はできません :bow:
    • ただし近々対応する予定です。

おまけ #1

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

おまけ #2

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?