我正在尝试使用官方 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
最佳答案
对此的解决方案是显式 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)
这是必要的,因为 load_table_from_json
方法将尝试创建自己的 LoadJobConfig
对象,如果没有显式传入 [ source code ].默认情况下加载作业将具有 autodetect=true
. BigQuery 服务器端的自动检测似乎不知道现有架构。换句话说:只要值中有小数,它就默认为 FLOAT
,即使它的目标列是 NUMERIC
并且该值与该数据类型兼容。如果您尝试将未加引号的数字插入 STRING
列,也会发生同样的事情。
关于python - 错误 : Field X "has changed type from NUMERIC to FLOAT" when INSERTing data to BigQuery with load_table_from_json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60230068/