错误:使用 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 /?为了