#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']
Без этого вам нужно построить гораздо более сложную строку, как вы обнаружили.