🅱️
BigQuery で csv 読み込み時に デフォルト値を挿入する方法
色々試したけどこれでできる
まとめ
- schemaの指定を必ず行う
- カラム指定にREQUIREDを使わない
- CSVの列数は必ず少なくする
手順
以下のファイルを作成して実験
schema.json
[
{
"name": "id",
"type": "STRING",
"mode": "NULLABLE",
"defaultValueExpression": "GENERATE_UUID()"
},
{
"name": "id2",
"type": "STRING",
"mode": "NULLABLE",
"defaultValueExpression": "GENERATE_UUID()"
}
]
test.csv
asdf
qew
1234
hoge
bq load --allow_jagged_rows=true --source_format=CSV --schema=./input.json matsukiyo.test ./test.txt
備考
■ schemaを指定しないとどうなるの?
→ 2列目のid2にはNULLが入ってしまう
このドキュメント の以下の部分はそういう意味らしい
JSON や CSV などのテキスト形式では、ファイル スキーマがエンコードされません。bq コマンドライン ツールを使用してスキーマを指定するには、--autodetect フラグを使用するか、JSON スキーマを指定します。
■ schemaのid2をREQUIREDにしたらどうなる?
→ 必須カラムが無いエラーになる
Error while reading data, error message: Required column value for column
index: 1 is missing in row starting at position: 10
■ テーブル定義時にREQUIREDにした上で、load時は NULLABLE だとどうなる?
→ テーブル定義が変わってしまったエラーが出る
BigQuery error in load operation: Provided Schema does not match Table
matsukiyo.test. Field id2 has changed mode from REQUIRED to NULLABLE
■ 一部分だけデフォルトにすることはできる?
→ できなさそう
test.csv
asdf,asdf
qew
1234
hoge
とした状態で bq load コマンドを実行しても、2行目以降はデフォルト値ではなくNULLで埋められてしまう
Discussion