Python BigQuery: вставка строк, содержимое которых равно цифре c, не удалась - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать некоторый код, который вставляет данные в Google Big Query, но не может быть уверен, что именно содержит содержимое полей String. Очевидно, у Big Query есть проблемы со строками типа «1.1» или «1»

Рассмотрим таблицу Big Query следующей минимальной схемы (только одно строковое поле с именем «stringer»:

[
  {
    "description": "string_debug",
    "mode": "NULLABLE",
    "name": "stringer",
    "type": "STRING"
  }
]
from google.cloud import bigquery
client = bigquery.Client()
dataset_id = 'bqsoba'
table_id = 'stringer'

dataset_ref = client.dataset(dataset_id)
table_ref = dataset_ref.table(table_id)
job_config = bigquery.LoadJobConfig()
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
job_config.autodetect = False

job = client.load_table_from_json([{'stringer':'1'}], table_ref, job_config=job_config)

job.result()  # Waits for table load to complete.

print("Loaded {} rows into {}:{}.".format(job.output_rows, dataset_id, table_id))

Результат в исключении:

---------------------------------------------------------------------------
BadRequest                                Traceback (most recent call last)
<ipython-input-46-3d68dddf9573> in <module>
     13 job = client.load_table_from_json(parsed[11:20], table_ref, job_config=job_config)
     14 
---> 15 job.result()  # Waits for table load to complete.
     16 
     17 print("Loaded {} rows into {}:{}.".format(job.output_rows, dataset_id, table_id))

~/apps/conda2019/lib/python3.7/site-packages/google/cloud/bigquery/job.py in result(self, timeout, retry)
    777             self._begin(retry=retry)
    778         # TODO: modify PollingFuture so it can pass a retry argument to done().
--> 779         return super(_AsyncJob, self).result(timeout=timeout)
    780 
    781     def cancelled(self):

~/apps/conda2019/lib/python3.7/site-packages/google/api_core/future/polling.py in result(self, timeout)
    125             # pylint: disable=raising-bad-type
    126             # Pylint doesn't recognize that this is valid in this case.
--> 127             raise self._exception
    128 
    129         return self._result

BadRequest: 400 Provided Schema does not match Table bi-project-231313:bqsoba.sa_hardware_collector. Field sysconfig.call_home_token has changed type from STRING to INTEGER

Можно ли попросить большой запрос "insert" трактовать '1' как строковое значение?

1 Ответ

1 голос
/ 13 января 2020

Вы можете определить свою схему вручную:

schema =   [{
    "mode": "NULLABLE",
    "name": "stringer",
    "type": "STRING"
  }]

И затем использовать ее перед выполнением задания:

job_config.schema = schema

Надеюсь, это поможет вам

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