使用自动检测加载数据时出现“无效架构更新”错误

San*_*iro 5 google-bigquery

假设我有一个表,其中有一个名为“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)

在上面列出的问题中,有一个答案表明已将修复程序推送到生产中,但看起来该错误又回来了。有没有办法/解决方法来防止这种情况?

Hua*_*ang 3

看起来这里令人困惑的部分是“1.12”是否应该被检测为字符串或浮点数。BigQuery 选择检测为浮点数。在 BigQuery 中引入自动检测之前,BigQuery 允许用户加载字符串格式的浮点值。这在 CSV/JSON 格式中很常见。因此,当引入自动检测时,它保留了这种行为。自动检测将扫描最多 100 行以检测类型。如果对于所有 100 行,数据都类似于“1.12”,则该字段很可能是浮点值。如果其中一行的值为“1.12.0”,那么 BigQuery 将检测到类型为字符串,正如您所观察到的。

  • *“这在 CSV/JSON 格式中很常见。”*,对于 CSV 是的,对于 JSON 绝对不是。在 JSON 中,字符串始终用引号括起来,数字从不用引号括起来。歧义为零(不幸的是,日期是另一回事)。 (3认同)