как решить повторяющуюся ошибку поля в большом запросе, вставленном через клиент python?

#python #google-bigquery #python-requests #google-api-python-client

#python #google-bigquery #python-запросы #google-api-python-client

Вопрос:

Я использую Google api, который возвращает данные в формате json, как показано ниже:

 {
            "storageLocations": [
                "us"],      
            
"autoCreated": true,
            
"downloadBytes": "77557"

}
  

Одно из возвращаемых полей — storageLocations, которое выглядит как тип массива, поэтому я определил его как повторяющееся поле в bigquery.

Мне нужно вставить эти данные в большой запрос с помощью клиента python-big-query, поэтому для этого поля я создал следующую структуру в big-query. введите описание изображения здесь

Для создания каждой строки я добавляю пустое поле row={} , перебираю ответ json и присваиваю его следующим образом :

 row["storageLocations.locations"]=response["storageLocations"]
  row["autoCreated"]= response["autoCreated"]
  

Когда данные вставляются

Для storageLocations я получаю эту ошибку

  u'insertErrors': [{u'index': 0, u'errors': [{u'debugInfo': u'', u'reason': u'invalid', u'message': u'no
     such field.', u'location': u'storageLocations.locations'}]}
  

Я тоже пробовал row["storageLocations"]["locations"] , и это тоже не работает.

Поскольку я новичок в python и big-query, я не уверен в ошибке.

Спасибо за ваши предложения.

Ответ №1:

Обычно, когда вы используете повторяющуюся запись, у вас, как правило, более одного конечного поля, или вы планируете добавить больше в будущем.

Ответ JSON, с которым вы работаете, выглядит так, как будто вы можете просто использовать массив строк.

Например:

 schema=[
    bigquery.SchemaField("storageLocations", "STRING", mode="REPEATED"),
    bigquery.SchemaField("autoCreated", "BOOL"),
    bigquery.SchemaField("downloadBytes", "INT64"),
]
  

С помощью более простой схемы вы должны просто иметь возможность отправлять свой список / кортеж строковых значений при вставке строк, например row["storageLocations"] = ['a','b','c']

Без этого вам нужно построить гораздо более сложную строку, как вы обнаружили.