BigQueryテーブル作成用のスキーマを自動生成する

GCPではCloud SDKなどでbqコマンドを使うことでBigQueryを扱うことができる。

 

さて、bqコマンドを使ってGCSにあるCSVからtableを作成する。BigQueryにはスキーマの自動検出がサポートされており、オプション--autodetectをつけてコマンドを実行すれば良い。

bq  load --autodetect  [DATASET].[TABLE] [PATH_TO_SOURCE]
BigQuery error in load operation: Error processing job 'clear-eye-231300:bqjob_r107534c5e807c9a3_00000168e21cb11a_1': Error while reading data, error message: CSV table encountered too many errors, giving
up. Rows: 1291; errors: 1. Please look into the errors[] collection for more details.
Failure details:

 失敗しとるやんけ。。。ドキュメントによると

自動検出を有効にすると、BigQuery はデータソース内でランダムにファイルを選択します。ファイルの最大 100 行をスキャンして代表的なサンプルとして使用し、推定プロセスを開始します。BigQuery は、各フィールドを検証し、そのサンプル内の値に基づいてそのフィールドにデータ型を割り当てようとします。

なるほど。。。

どうやらデータによっては自動検出はうまく動かないようだ。スキーマjsonに記述しても良いが、カラムが多いと正直大変だ。部分的にでも自動検出の結果が使用できれば嬉しいのだが、特にAPIはなくloadが失敗してしまうと自動検出の情報は取得できない。

 

そこで、スキーマのテンプレートを自動で生成したい。何を使っても良いのだが、ここではpandasのdtype情報を利用する方法を考える。サンプルスクリプトを作成した。

https://github.com/ToshikiShimizu/kaggle/blob/master/tool/source/generate_bq_fmt.py

このスクリプトを実行するとtable_schema.jsonが生成される。今回はサンプルであるので全てのカラムをSTRING型としているが、データに合わせて適宜修正を加えてほしい。

 

このスクリプトを作って生成したjsonを使って、

bq  load   [DATASET].[TABLE] [PATH_TO_SOURCE] table_schema.json

とすれば無事にtableが作成される。

 

もっと良い方法があればぜひコメントをお願いします!