先週金曜日にあった #bq_sushi tokyo #3 で、BigQueryのテーブルスキーマ変更における困難についてトークしてきたので資料をおいておきます。 bq_sushi #1、#2 の頃はまだ BigQuery を使っておらず、ただの聴衆だったので、今回話をできてよかったです。急遽枠を作ってくれた @kazunori_279 さん、@hakobera さんありがとうございました。
https://speakerdeck.com/sonots/bigquery-schema-migration-number-bq-sushi
今回公開したツールのアドレスはこちらになります。gem リリースもしました。社内で作っているツールから、今回の発表にあわせて切り出したものになるので、発表機会がなかったらおそらくOSSにされることはなかったでしょう😜
https://github.com/sonots/bigquery_migration
内部の動きについては資料を参照していただいたほうが良いのですが、簡単に言うと、以下のような動きをします。基本的には select & copy なので(データを再ロードするのに比べて)素早くスキーマ変更を実施できます。
- あるべき姿のスキーマと、現在のスキーマを比較する
- カラムの追加が必要な場合は、まず patch table API を呼び出す
- カラムの削除、または型変更が必要な場合は、そこからさらに select & copy する (load job API に query と destination_table を指定する)
- 型変更はキャスト関数を使って実現
- カラム削除はそのカラムを select しなければ実現できる
ただし、制約として以下のものがあって、発表ではそのあたりの困難さをずっと話していました。BigQuery の現在の機能上、解決できない認識でいますが、何かうまくできる方法を御存知の方がいらっしゃったら是非お教えください。
- mode: REPEATED カラムを扱えない
- mode: NULLABLE カラムのみ追加可能
- 型変更すると mode: NULLABLE になる
- 課金される(カラム追加だけならば patch table API なので課金されない)
このあたりの制約を許容できない場合は、時間がかかりますが、BigQuery へのデータ Load を丸ごとやり直して頂くしかないですね。話を聞くには皆さんはスキーマ変更、もしくはデータの洗い替えが必要な場合は仕方ないのでそのようにしているとのことでした。今回のツールは、制約を許容できる範囲内で、素早くスキーマ変更できる選択肢が増えたと捉えていただけると良いかと思います。早く patch table API で型変更と、削除ができるようになってくれ頼む〜
あと、資料にも貼ってありますが、4月23日発売の WEB+DB Press 4月号に Treasure Data の @frsyuki くんと自分と、クックパッド社の面々で、データ収集特集の記事を書いているのでよろしくお願いします。BigQuery ユーザの方もそうでない方も、Fluentd、Embulk ユーザの方もそうでない方も是非手にとってみてください!
最後に、今回のスキーマ変更の調査、実装に関しては、後ろの席の @kysnm さんのご協力がありました。この場を借りて御礼申しあげます mm