错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”

Posted

技术标签:

【中文标题】错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”【英文标题】:Error: Field X "has changed type from NUMERIC to FLOAT" when INSERTing data to BigQuery with load_table_from_json 【发布时间】:2020-02-14 16:23:14 【问题描述】:

我正在尝试使用官方 Python SDK 将数据添加到 BigQuery 表。

当我将一些 JSON 传递到 load_table_from_json(data, table) function 时,API 响应抱怨我的值之一是数据集中的 FLOAT,但表的架构显示该列是 NUMERIC。值为0.0

由于 JSON 没有明确的数据类型,因此令人困惑的是 API 如何/为什么会认为它是 FLOAT 类型,或者我如何强制它知道其他类型。我认为 BigQuery 的 API 足够聪明,可以知道值可以安全地插入到任一列类型中。

完整的错误信息是:

400 Provided Schema does not match Table my-project:my-dataset.my-table. Field count_purchased has changed type from NUMERIC to FLOAT

【问题讨论】:

【参考方案1】:

对此的解决方案是明确地specify your own schema 告诉 BigQuery 这是一个NUMERIC 值。这是通过在调用load_table_from_json(data, table, job_config=my_job_config) 时传递LoadJobConfig 来完成的。

以下是我为加载作业定义架构的方式。请注意,我唯一需要传入的是模式定义;其余默认设置正常。

my_schema = [
  
    "name": "count_purchased",
    "type": "NUMERIC"
  ,
    "name": "_load_datetime",
    "type": "DATETIME"
  
]

my_job_config = bigquery.LoadJobConfig(schema=my_schema)

client = bigquery.Client()
client.load_table_from_json(data, table, job_config=my_job_config)

这是必要的,因为如果没有明确传入 [source code],load_table_from_json 方法将尝试创建自己的 LoadJobConfig 对象。默认情况下,加载作业将具有autodetect=true。 BigQuery 服务器端的自动检测似乎不知道现有架构。换句话说:只要值中有小数点,它就会默认为FLOAT,即使它的目标列是NUMERIC,并且该值与该数据类型兼容。如果您尝试在 STRING 列中插入未引用的数字,也会发生同样的情况。

【讨论】:

我也认为自定义模式是强制数据类型的好方法。值得一提的是,BigQuery 有可以根据特定规则应用的转换规则,更多信息请参见Conversion rules in Standard SQL。

以上是关于错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用捕获错误处理角度错误

提交表单时jsfiddle错误“错误”:“请使用POST请求”

vc++编译错误RC:致命错误RC1107:无效使用;使用 RC /?为了

雪花存储在使用抛出错误而不是返回错误时给出不同的错误

错误:使用天气 API 时出现 XMLHttpRequest 错误

如何修复错误“错误:命令错误退出状态 1:python。”尝试使用 pip 安装 fitz 模块时?