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型としているが、データに合わせて適宜修正を加えてほしい。
bq load [DATASET].[TABLE] [PATH_TO_SOURCE] table_schema.json
とすれば無事にtableが作成される。
もっと良い方法があればぜひコメントをお願いします!