Ошибка: поле X "изменило тип с NUMERI C на FLOAT" при вставке данных в BigQuery с load_table_from_json - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь добавить данные в таблицу BigQuery, используя официальный Python SDK.

Когда я передаю JSON в load_table_from_json(data, table) функцию , ответ API жалуется, что одно из моих значений - FLOAT в наборе данных, но схема таблицы говорит, что столбец - NUMERIC. Значение равно 0.0.

Поскольку JSON не имеет явных типов данных, сбивает с толку то, как / почему API может думать, что это тип FLOAT, или как я мог заставить его знать иначе. Я думаю, что API BigQuery был бы достаточно умен, чтобы знать, что значение может быть безопасно вставлено в любой тип столбца.

Полное сообщение об ошибке:

400 Provided Schema does not match Table my-project:my-dataset.my-table. Field count_purchased has changed type from NUMERIC to FLOAT

1 Ответ

2 голосов
/ 14 февраля 2020

Решение этого заключается в том, чтобы явно указать собственную схему , чтобы сообщить BigQuery, что это значение NUMERIC. Это делается путем передачи LoadJobConfig при вызове 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)

Это необходимо, потому что метод load_table_from_json попытается создать свой собственный объект LoadJobConfig, если он явно не передан в [ исходный код ]. Задание загрузки по умолчанию будет иметь autodetect=true. Кажется, что автообнаружение на стороне сервера BigQuery не знает о существующей схеме. Другими словами: по умолчанию он равен FLOAT каждый раз, когда в значении есть десятичное число, даже если его целевой столбец равен NUMERIC и значение совместимо с этим типом данных. То же самое происходит, если вы попытаетесь вставить число без кавычек в столбец STRING.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...