(Dataform とは https://dataform.co/ のことです)
要件
ref()
を使ったテーブル間参照についてはとりあえず考えないことにする- BigQuery の dataset 名と、Dataform の definitions/ 内のディレクトリ構成をなんとなく一致させたい
ってことで、Ruby でこういうかんじでできると思う。google-cloud-bigquery gem とかですらなくて bq CLI を叩いてるだけであまりに素朴だけど、まあふつうに出来てしまうわけだからいいかという気持ちです
require 'json' require 'fileutils' target_project = 'super-gcp-bigdata-project' target_datasets = %w{nantoka__mart nantoka__warehouse} dataform_repo_root = '/path/to/dataform-linked-repo-root/' target_datasets.each do |dataset_name| FileUtils.mkdir_p File.join(dataform_repo_root, "definitions/#{dataset_name}") res = JSON.parse(`bq query --format prettyjson --location asia-northeast1 --use_legacy_sql=false 'SELECT * FROM #{target_project}.#{dataset_name}.INFORMATION_SCHEMA.VIEWS;'`) res.each do |table| table_name = table["table_name"] query = table["view_definition"] path = "definitions/#{dataset_name}/#{table_name}.sqlx" dest_path = File.join(dataform_repo_root, path) File.open(dest_path, "w") do |f| f.write(<<EOF config { type: "view", schema: "#{dataset_name}", } #{query} EOF ) end end end
これを実行すると '/path/to/dataform-linked-repo-root/'
のディレクトリ下に sqlx ファイルがだかだか発射されるということになるので、それを目視で軽く確認しながら手でコミット & master ブランチ的存在にマージ、とするとよい、という想定。
ミソ
- BigQuery にも INFORMATION_SCHEMA というのがあり、テーブルやデータセットなんかのメタデータを SQL として取得できる。ビューの情報を取得することも出来て、その中にはビューを作る SQL クエリの文字列 (
view_definition
) が含まれている- Getting view metadata using INFORMATION_SCHEMA | BigQuery
- BigQuery の
INFORMATION_SCHEMA
はデータセット単位の存在っぽいので、処理対象にしたいデータセットごとに each とかで回す、みたいな感じになる - ほかにもジョブの情報とかがとれて大変おもしろい