Запись в таблицу BigQuery из объекта json

Пробую записать в таблицу BigQuery объект json полученный через API запрос к сервису. Данные считываются порционно и так же порционно обновляются в таблице. При первой загрузке порции данных из json формируется схема таблицы BigQuery (свойство autoDetect = True по умолчанию).

while True:

    json_result = request.read_data()

    loadJob = client.load_table_from_json(json_result, table) 
    loadJob.result()
    
    if not has_more_data():
      break

Проблема в том, что изначально в схему для поля nm_id записалось INTEGER, а поле по факту должно быть STRING.

Пробовала задать схему по умолчанию для таблицы BigQuery

      bigquery.SchemaField("realizationreport_id", "INTEGER", mode="NULLABLE"),
      bigquery.SchemaField("suppliercontract_code", "STRING", mode="NULLABLE"),
      bigquery.SchemaField("rrd_id", "INTEGER", mode="REQUIRED"),
      bigquery.SchemaField("gi_id", "INTEGER", mode="NULLABLE"),
      bigquery.SchemaField("subject_name", "STRING", mode="NULLABLE"),
      bigquery.SchemaField("nm_id", "STRING", mode="NULLABLE"), #integer
      bigquery.SchemaField("barcode", "STRING", mode="NULLABLE"),#integer
      ...................

Кусочек JSON объекта:

{
"realizationreport_id":5200242,
"suppliercontract_code":null,
"rrd_id":4681869162,
"gi_id":3246258,
"subject_name":"\xd0\x9a\xd0\xb0\xd0\xbb\xd1\x8c\xd1\x81\xd0\xbe\xd0\xbd\xd1\x8b",
"nm_id":44185221,          <--- serialized to INTEGER but should be STRING
"barcode":"2010739265043"  <--- serialized to INTEGER but should be STRING
........
}
job_config = bigquery.LoadJobConfig(
                schema = wb_options.get_schema(),  # схема указана в примере выше              
                autodetect = False
                )

loadJob = client.load_table_from_json(json_result, table, job_config=job_config)  
loadJob.result()

получаю ошибку

JSON parsing error in row starting at position 0: Could not convert value to string. Field: nm_id; Value: 44185221

К слову, 'barcode' тоже переводится в INTEGER , хотя значение заключено в двойные кавычки

Google bigquery API при записи json в таблицу делает следующие шаги (предполагаю, могу ошибаться)

  1. сначала переделывает json в newline-delimited JSON string (https://github.com/googleapis/python-bigquery/blob/66b3dd9f9aec3fda9610a3ceec8d8a477f2ab3b9/google/cloud/bigquery/client.py#L2710)
  2. перекладывает временный файл в свое облако (https://github.com/googleapis/google-resumable-media-python/blob/d0827725085ab064169cda004a4fde65e92813f0/google/resumable_media/requests/upload.py#L348)
  3. делает запрос к сервису и записывает ответ в таблицу BigQuery json.dumps(metadata).encode("utf-8") (исходя из https://github.com/googleapis/google-resumable-media-python/blob/d0827725085ab064169cda004a4fde65e92813f0/google/resumable_media/_upload.py#L480)

возможно есть способ подставить decoder в metadata, чтобы конкретный ключ "nm_id" принимал тип STRING?

Так же не совсем понимаю, что такое metadata, изначально это bigquery.LoadJobConfig переделанный в map. То есть теоретически я могу добавить cls=JsonDecoder в metadata?

Или надо как-то извернуться с настройками bigquery.LoadJobConfig ? (настройка decimal_target_types не подходит, т.к. сначала все равно переделает в NUMBER)

Спасибо , что дочитали

Очень жду помощи


Ответы (0 шт):