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

Eri*_*and 3 python google-bigquery

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

当我将一些 JSON 传递到load_table_from_json(data, table)函数中时,API 响应抱怨我的值之一是FLOAT数据集中的 a,但表的架构表明该列是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
Run Code Online (Sandbox Code Playgroud)

Eri*_*and 6

解决方案是显式指定您自己的架构来告诉 BigQuery 这是一个NUMERIC值。LoadJobConfig这是通过在调用时传递 a 来完成的load_table_from_json(data, table, job_config=my_job_config)

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

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)
Run Code Online (Sandbox Code Playgroud)

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