假设我有一个表,其中有一个名为“version”的字段,它是一个字符串。当尝试将数据加载到表使用自动检测与像值"1.1"
或"1"
分别将这些值作为浮点型或整数型的自动检测功能推断。
data1.json示例:
{ "version": "1.11.0" }
Run Code Online (Sandbox Code Playgroud)
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" }
Run Code Online (Sandbox Code Playgroud)
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" }
Run Code Online (Sandbox Code Playgroud)
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 时,该 JSON 的值被正确推断为字符串(如数据问题中的Bigquery 自动转换字段中所示):
{ "version": "1.12" }
{ "version": "1.12.0" }
Run Code Online (Sandbox Code Playgroud)
在上面列出的问题中,有一个答案表明已将修复程序推送到生产中,但看起来该错误又回来了。有没有办法/解决方法来防止这种情况?
看起来这里令人困惑的部分是“1.12”是否应该被检测为字符串或浮点数。BigQuery 选择检测为浮点数。在 BigQuery 中引入自动检测之前,BigQuery 允许用户加载字符串格式的浮点值。这在 CSV/JSON 格式中很常见。因此,当引入自动检测时,它保留了这种行为。自动检测将扫描最多 100 行以检测类型。如果对于所有 100 行,数据都类似于“1.12”,则该字段很可能是浮点值。如果其中一行的值为“1.12.0”,那么 BigQuery 将检测到类型为字符串,正如您所观察到的。
归档时间: |
|
查看次数: |
4640 次 |
最近记录: |