假设我有一个表有一个名为“version”的字段,这是一个字符串。当我尝试使用类似"1.1"
或"1"
的值的自动检测将数据加载到表中时,自动检测功能分别将这些值推断为float或integer类型。
data1.json 示例:
{ "version": "1.11.0" }
bq load
输出:
$ bq load --autodetect --schema_update_option=ALLOW_FIELD_ADDITION --source_format=NEWLINE_DELIMITED_JSON temp_test.temp_table ./data1.json
Upload complete.
Waiting on bqjob_ZZZ ... (1s) Current status: DONE
data2.json 示例:
{ "version": "1.11" }
bq load
输出:
$ bq load --autodetect --schema_update_option=ALLOW_FIELD_ADDITION --source_format=NEWLINE_DELIMITED_JSON temp_test.temp_table ./data2.json
Upload complete.
Waiting on bqjob_ZZZ ... (0s) Current status: DONE
BigQuery error in load operation: Error processing job 'YYY:bqjob_ZZZ': Invalid schema update. Field version has changed type from STRING to FLOAT
data3.json 示例:
{ "version": "1" }
bq load
输出:
$ bq load --autodetect --schema_update_option=ALLOW_FIELD_ADDITION --source_format=NEWLINE_DELIMITED_JSON temp_test.temp_table ./data3.json
Upload complete.
Waiting on bqjob_ZZZ ... (0s) Current status: DONE
BigQuery error in load operation: Error processing job 'YYY:bqjob_ZZZ': Invalid schema update. Field version has changed type from STRING to INTEGER
没有发生此问题的情况是,在同一个文件中,您有另一个JSON,其值正确地推断为字符串(如Bigquery autoconverting fields in data问题中所示):
{ "version": "1.12" }
{ "version": "1.12.0" }
在上面列出的问题中,有一个答案表明修复程序已推送到生产环境,但看起来该错误又回来了。有没有办法/解决方法来阻止这种情况?
答案 0 :(得分:3)
这里看起来令人困惑的部分是“1.12”应该被检测为字符串还是浮点数。 BigQuery选择检测为float。在BigQuery中引入自动检测之前,BigQuery允许用户以字符串格式加载浮点值。这在CSV / JSON格式中非常常见。因此,当引入自动检测时,它会保留此行为。自动检测最多可扫描100行以检测类型。如果对于所有100行,数据类似于“1.12”,则该字段很可能是浮点值。如果其中一行的值为“1.12.0”,那么BigQuery将检测到类型是字符串,如您所观察到的那样。