假设我有一个名为"版本"的单个字段,即字符串。当我尝试使用"1.1"
或"1"
等值的AutoDect将数据加载到表中时,AutoDeTECT功能分别将这些值分别为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 AutoConeoConverting tagation tagation Comession中所示(:
{ "version": "1.12" }
{ "version": "1.12.0" }
在上面列出的问题中,有一个答案指出修复程序已被推入生产,但看来该错误又回来了。有没有办法/解决方法可以防止这种情况?
看起来令人困惑的部分是应将" 1.12"检测为字符串还是浮点。Bigquery选择以浮动为单位。在BigQuery中引入AutoDect之前,BigQuery允许用户以字符串格式加载浮点值。这在CSV/JSON格式中非常普遍。因此,当引入自动检索时,它将保持这种行为。自动检索将扫描多达100行以检测类型。如果对于所有100行,数据就像" 1.12",那么此字段很可能是浮点值。如果一行中的一个具有" 1.12.0"的值,那么BigQuery将检测到类型是字符串,如您所观察到的。