🅱️

BigQuery で csv 読み込み時に デフォルト値を挿入する方法

2023/05/13に公開

色々試したけどこれでできる


まとめ

  • 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