背景
CSVをBigQueryをロードしたいケースはよくあります。何かのはずみに、CSVのカラムが変更され、想定されていないスキーマのCSVが配置されてしまうことは考えられます。そういった場合にロードジョブがどういう挙動をするのかを条件別にまとめました。
TL;DR
- CSVロードジョブを運用する場合、カラム定義は
autodetect
ではなく、schemaファイルを用意しましょう - CSVカラムの追加や削除がある場合は、基本的にロードジョブはエラーとなるので、schema.jsonファイルを変更して対応しましょう
- CSVの末尾にカラムが追加される or CSVの末尾のカラムが削除される場合は、loadジョブのオプションによっては、schema.jsonファイルの更新なしでもエラーとせずにジョブを実行させることが可能です
考慮する条件
前提条件
- 今回はpythonの
LoadJobConfig
とload_table_from_uri
を使ったロードジョブとします - schemaファイルは用意されてあるとします
- autodetectジョブでの運用はできるだけ避けましょう
- WRITE_TRUNCATEで検証します(基本WRITE_APPENDでも挙動は一緒)
- headerなしCSVデータです(headerあってもschemaファイルがある場合挙動は一緒)
ケース
- カラムが末尾に追加される場合
- カラムが中間に追加される場合
- 末尾のカラムが削除される場合
- 中間のカラムが削除される場合
ケース別の挙動
1.カラムが末尾に追加される場合
- デフォルトの
LoadJobConf
でのロードではToo many values in row starting at position: 0. Found 4 column(s) while expected 3.
エラーとなります -
ignore_unknown_values=True
オプションをLoadJobConfig
に指定すると、末尾のカラムを無視してLoadされます
2.カラムが中間に追加される場合
- デフォルトの
LoadJobConf
でのロードではToo many values in row starting at position: 45. Found 4 column(s) while expected 3.
でエラーとなります -
ignore_unknown_values=True
オプションをLoadJobConfig
に指定すると、schemaズレの状態でloadしようとします- データ型に相違がない場合はschemaズレのままload成功してしまいます
- データ型に相違がある場合はエラーとなります
3.末尾のカラムが削除される場合
- デフォルトの
LoadJobConf
でのロードではCSV table references column position 2, but line starting at position:20 contains only 2 columns.
エラーとなります -
allow_jagged_rows: True
オプションをLoadJobConfig
に指定すると、末尾のカラムがNULLでloadされます
4.中間のカラムが削除される場合
- デフォルトの
LoadJobConf
でのロードではCSV table references column position 2, but line starting at position:20 contains only 2 columns.
でエラーとなります -
allow_jagged_rows: True
オプションをLoadJobConfig
に指定すると、schemaズレの状態でloadしようとします- データ型に相違がない場合はschemaズレのままload成功してしまいます
- データ型に相違がある場合はエラーとなります