【问题标题】:Error: Field X "has changed type from NUMERIC to FLOAT" when INSERTing data to BigQuery with load_table_from_json错误:使用 load_table_from_json 将数据插入 BigQuery 时,字段 X“已将类型从 NUMERIC 更改为 FLOAT”
【发布时间】: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

【问题讨论】:

    标签: python google-bigquery


    【解决方案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
    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多