はじめに
表題のとおりですが、bqコマンドなんかを使用してDATE型の値をINSERTしようとすると以下のようなエラーになりました。
この原因と対処法について。
どういうエラーか
まず、INSERTするSchemaとdataです。
schema
$ cat ./schema.json [ { "mode": "NULLABLE", "name": "employee_id", "type": "STRING" }, { "mode": "NULLABLE", "name": "birthday", "type": "STRING" }, { "mode": "NULLABLE", "name": "name", "type": "STRING" }, { "mode": "NULLABLE", "name": "partition_date", "type": "DATE" } ]
data
$ cat ./source.csv 1001,20210101,hoge,20210101 1002,20210303,fuga,20210101 1003,20210505,piyo,20210101 1004,20210707,fufu,20210101
つぎにINSERTです。
以下のようにエラーで怒られます。
$ bq load \ > --replace \ > --source_format=CSV \ > --schema=./schema.json \ > [your project]:bq_command_dataset.bq_command_pt_table \ > ./source.csv Upload complete. Waiting on bqjob_r187e4b6bf330eafd_000001781872232f_1 ... (0s) Current status: DONE BigQuery error in load operation: Error processing job '[your project]:bqjob_r187e4b6bf330eafd_000001781872232f_1': Error while reading data, error message: Could not parse '20210101' as DATE for field partition_date (position 3) starting at location 0 with message 'Unable to parse' Failure details: - Error while reading data, error message: CSV processing encountered too many errors, giving up. Rows: 1; errors: 1; max bad: 0; error percent: 0 - query: Could not parse '20210101' as DATE for field partition_date (position 3) starting at location 0 with message 'Unable to parse'
対処法
公式サイトに記載がありますが、YYYY-MM-DD形式
が必須らしいです。
CSV データまたは JSON データを読み込む場合、DATE 列の値に区切りとしてダッシュ(-)を使用し、YYYY-MM-DD(年-月-日)の形式にする必要があります。
ということで、YYYY-MM-DD
に変えてやるとINSERTが成功します。
# YYYYMMDDに変更する $ cat source.csv 1001,20210101,hoge,2021-01-01 1002,20210303,fuga,2021-01-01 1003,20210505,piyo,2021-01-01 1004,20210707,fufu,2021-01-01 # 成功する $ bq load \ > --replace \ > --source_format=CSV \ > --schema=./schema.json \ > [your project]:bq_command_dataset.bq_command_pt_table \ > ./source.csv Upload complete. Waiting on bqjob_rc9c3d4712ae526_00000178187453d6_1 ... (0s) Current status: DONE
おわりに
BigQuery,とくにbqコマンドはオプションやルールがたくさんあるので公式を良く読むのが吉ですね!