python - 错误 : Field X "has changed type from NUMERIC to FLOAT" when INSERTing data to BigQuery with load_table_from_json

标签 python google-bigquery

我正在尝试使用官方 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/

相关文章:

javascript - 如何将 javascript 的值传递给 Mako 模板

sql - 如何使用 BigQuery DML 转换嵌套在数组、结构体、数组内的结构体的某些字段?

python - pycharm的python控制台中的路径一级太低

python - 在TensorFlow中展平包含向量的2D张量的最佳方法?

json - BigQuery 在导入 JSON 时处理缺失字段和未知/额外字段

google-bigquery - 向时间戳字段添加五个小时

sql - 在 BigQuery Google Analytics 数据中提取两个页面之间的用户旅程数据

python - Bigrquery 不能强制整数

python - 用于 Celery 堆栈跟踪的 Logstash 多行编解码器

Python:Pandas Groupby 然后失败率